web-dev-qa-db-ja.com

Laravelでの「Mass Assignment」とはどういう意味ですか?

Laravel Eloquent ORMトピックパーツに関するドキュメントを調べてみると、Mass Assignmentという新しい用語が追加されました。

ドキュメントショーマスアサインメントの方法とfillableまたはguardedプロパティ設定。しかし、それを経て、Mass Assignmentとその仕組みについて明確に理解できませんでした。

CodeIgniterでの過去の経験では、この用語についても聞いていませんでした。

それについて簡単な説明はありますか?

128
Chen-Tsu Lin

一括割り当てとは、モデル作成に配列を送信するときのことです。基本的に、次のような1つずつではなく、1回の操作でモデルに一連のフィールドを設定します。

$user = new User(Input::all());

(これは、モデルの各値を個別に明示的に設定する代わりに行われます。)

fillableを使用して、実際に更新を許可するフィールドを保護できます。

ユーザーテーブルにuser_typeというフィールドがあり、user/adminの値を持つことができるとしましょう

明らかに、ユーザーがこの値を更新できないようにする必要があります。理論的には、上記のコードを使用した場合、誰かがuser_typeの新しいフィールドをフォームに挿入し、他のフォームデータとともに 'admin'を送信し、アカウントを管理者アカウントに簡単に切り替えることができます... badニュース。

追加することにより:

$fillable = array('name', 'password', 'email');

mass assignmentを使用してこれらの値のみを更新できるようにします

user_type値を更新できるようにするには、次のようにモデルに明示的に設定して保存する必要があります。

$user->user_type = 'admin';
$user->save();
177
duellsy

一括割り当ては、指定されたモデルに一度に保存されるデータの配列を送信するプロセスです。一般に、モデルにデータを1つずつ保存する必要はなく、1つのプロセスで保存する必要があります。

一括割り当ては適切ですが、その背後には特定のセキュリティ問題があります。誰かがモデルに値を渡し、保護なしでIDを含むすべてのフィールドを確実に変更できるとしたらどうでしょう。それは良いことではありません。

"student_type、first_name、last_name"というフィールドを持つ 'students'テーブルがあるとしましょう。 student_typeが直接変更されるのを防ぐために、fillableおよびguardedが実行されます。

Fillableを使用すると、モデル内でどのフィールドを一括割り当てできるかを指定できます。モデルに特別な変数$fillableを追加することで、それを行うことができます。モデルでは:

class Student extends Model {
      protected $fillable = ['first_name', 'last_name']; //only the field names inside the array can be mass-assign
} 

'student_type'は含まれません。つまり、免除されます。

ガードは、fillableの逆です。 fillableがどのフィールドを一括割り当てするかを指定する場合、guardedはどのフィールドが一括割り当てできないかを指定します。モデルでは:

class Student extends Model {
      protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}

両方ではなく、$ fillableまたは$ guardedのいずれかを使用する必要があります。

詳細については、リンクを開いてください: Mass Assignment

19
Udhav Sarvaiya

一括割り当てとは、データの配列を使用して行を複数の列で埋めることを意味します。 (手動で配列を構築するのではなく、ややショートカット)Input::all()を使用します。

技術的には頭の上から。 Fillableは、テーブル内のどの列を挿入できるかを意味し、guardedは、モデルがその特定の列に挿入できないことを意味します。

Likeで一括割り当てを実行しようとすると、「secret」という名前の列に挿入し、ガードされるように指定している場合、モデルを介して挿入を試みることができますが、実際には挿入されませんデータベース。

これは、モデルを使用するときのセキュリティとテーブルの保護のためです。一括割り当ては、充填可能で保護されているモデルを伝えなかったという通知または警告であり、ある種の攻撃に対して脆弱になります。

5
majidarif

UPDATE

Laravel 5.xについては、最新のドキュメントを参照できます 質量の割り当て

OR

fillableまたはguarded を使用する場合の詳細な説明

3
Ikong

これは、受信したデータの配列がモデルに一度に保存されるときです。

Laravelのこのメソッドにはセキュリティ上の問題があるため、要求されたデータをモデルに入力するフィールドを定義することをお勧めします。

$fillable変数を使用して、データベーステーブルに入力するフィールドを定義できます。

例えば

Protected $fillable = [‘username’, ‘dob’, ‘email’,];

laravelは、データを一括割り当てしていることを検出すると、モデルクラスで一括割り当てするフィールドを強制的に定義します。

誰かが簡単に不要なデータをHTMLフォームにデータベースに渡すことができます。

1