LoginSignup
83
52

More than 5 years have passed since last update.

[Laravel 5.7] Eloquent Modelのfillableとguardedの違い

Last updated at Posted at 2018-10-23

前提知識

以下のように大雑把にモデルを作成するとき、ユーザー入力値を反映したくない属性を保護する必要があります。
ちなみに、このように配列を渡してモデルを作成することをドキュメントでは複数代入と言っています。

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使うと良いのでしょうかね・・・

83
52
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
83
52