前提知識
以下のように大雑把にモデルを作成するとき、ユーザー入力値を反映したくない属性を保護する必要があります。
ちなみに、このように配列を渡してモデルを作成することをドキュメントでは複数代入と言っています。
Model::create($request->all());
// または
new Model($request->all());
保護するには、モデルにfillableまたはguardedプロパティを指定します(どちらか片方のみ)。
fillableはホワイトリストで、guardedはブラックリストです。
BarModel
protected $fillable = ['name', 'hobby'];
// または
protected $guarded = ['id', 'created_at', 'updated_at'];
保存時に結構違いが出ます。
fillableを指定した場合
モデルがその属性以外を持ちません。
// protected $fillable = ['name', 'hobby'];
$model = new Model([
'id' => 9999,
'name' => 'Suzuki',
'hobby' => 'Music',
'created_at' => '2000-01-01 12:00:00',
'updated_at' => '2000-01-01 12:00:00',
'hoge' => 'fuga',
]);
$model->getAttributes(); // ['name' => 'Suzuki', 'hobby' => 'Music']
$model->save(); // 成功
guardedを指定した場合
モデルからその属性が取り除かれます。
// protected $guarded = ['id', 'created_at', 'updated_at'];
$model = new Model([
'id' => 9999,
'name' => 'Suzuki',
'hobby' => 'Music',
'created_at' => '2000-01-01 12:00:00',
'updated_at' => '2000-01-01 12:00:00',
'hoge' => 'fuga',
]);
$model->getAttributes(); // ['name' => 'Suzuki', 'hobby' => 'Music', 'hoge' => 'fuga']
$model->save(); // エラー。hogeカラムはテーブルにない
どちらがおすすめか
保存するときは$request->all()でも何でもブチ込めるfillableの方が楽です。
どういうモデルにguarded使うと良いのでしょうかね・・・