Laravel雄弁ORMにおける質量割当の理解


Laravel Eloquent ORMは、データベースで動作する単純なAPIを提供します.それはActive Recordパターンの実装です.各データベーステーブルは、そのテーブルと相互作用するために使用されるモデルクラスにマップされます.

質量配分
この単語を分解しましょう.

  • 質量は大きな数を意味する

  • 代入演算子
  • における代入演算子を意味する
    開発者の生活を容易にするために、雄弁なORMは、データベースに入力を大量に挿入(挿入)するのに役立ちます質量割り当て機能を提供しています.

    大量割当なし😩
    ユーザ情報の10フィールドの形式があると考えましょう.
        <form method="POST" action="/signup">
            <input type="text" name="name" />
            <input type="text" name="user_name" />
            <input type="text" name="password" />
            <input type="text" name="address" />
            <input type="text" name="city" />
            ...
            ...
            ...
            <button type="submit">Signup</button>
        </form>
    
    コントローラのストアメソッドは次のようになります.
    public function store(Request $request)
    {
        //perform validation
    
        $user = new User;
    
        $user->name = $request->get('name');
        $user->user_name = $request->get('user_name');
        $user->password = bcrypt($request->get('password'));
        $user->address = $request->get('address');
        $user->city = $request->get('city');
    
        //....
    
        $user->save();
    }
    
    それぞれの入力をモデルに手動で割り当て、データベースに保存します.

    What if there was a way to insert all the coming input without the manual assignment?



    多数の課題🥳
    ララベルElququent ORMは、1行ですべての入力を保存することができます作成方法を提供します.
    public function store(UserFormRequest $request)
    {
        //validation performed in the UserFormRequest
    
        $user = User::create($request->validated());
    } 
    
    どのようにクールは、右ですか?🤓 一行で、すべての入力をデータベースに保存します.将来的に、私たちのHTMLフォームにより多くの入力フィールドを加えるなら、私たちはデータベース部分への私達の保存を心配する必要はありません.

    Input fields name attribute must match the column name in our database.



    潜在的脆弱性
    理解のために、私たちにはtrue/false値でユーザーテーブルの上にisRange管理者列があると考えましょう.
    悪意のあるユーザーは、以下のように自分のHTML、隠し入力を入力できます.
        <form method="POST" action="/signup">
    
            <input type="hidden" name="is_admin" value="1" />
    
            <input type="text" name="name" />
            <input type="text" name="user_name" />
            <input type="text" name="password" />
            <input type="text" name="address" />
            <input type="text" name="city" />
            ...
            ...
            ...
            <button type="submit">Signup</button>
        </form>
    
    大量の割り当てでは、iSounds管理者はtrueに割り当てられます、そして、ユーザーはウェブサイトで管理権を持ちます😡

    脆弱性を避ける
    これを扱う方法は二つあります.
  • 私たちは、どの列が大量に割り当てられるかを指定できます.
  • ララベルElququentは、これを達成する簡単な方法を提供します.モデルクラスで、$fillableプロパティを追加し、次のような配列で列の名前を指定します
    class User extends Model
    {
        protected $fillable = [
            'name',
            'user_name',
            'password',
            'address',
            'city'
            ...
        ];
    }
    
    create ()メソッド以外の入力フィールドは、MassAssignmentExceptionをスローします.
  • 私たちは、どのカラムを割り当てることができないかを指定できます.
  • モデルクラスで$guardedプロパティを追加することでこれを実現できます.
    class User extends Model
    {
        protected $guarded = ['is_admin'];
    }
    
    IsRange管理者以外のすべてのコラムは、現在大量に割り当てられるでしょう.

    You can either choose $fillable or $guarded but not both.


    それで、あなたはそれを持ちます.Laravel Elququentでハッピーミサを割り当てる🥳 👨🏽‍💻