はじめに
今回はEloquentの $fillable 指定についてです。
基本的に $guarded を使う方が良いと思っているのでそれについて簡単に書いてみようと思います。
$fillable と $guarded
$fillable
$fillable は指定したカラムのみ、create()やfill()、update()で値が代入される、所謂ホワイトリストです。
<?php
namespace App\Models;
use App\Models\Model as AppModel;
class User extends AppModel
{
protected $fillable = [
'name',
'sex',
];
}
$guarded
$guarded は指定したカラムのみ、create()やfill()、update()で値が代入されない、所謂ブラックリストです。
<?php
namespace App\Models;
use App\Models\Model as AppModel;
class User extends AppModel
{
protected $guarded = [
'id',
];
}
長所と短所
$fillable
長所
- 指定したもの以外は入り得ない
短所
- カラムが増えるたびに追加する必要がある。
- 特に横に長いテーブルだとツラい
$guarded
長所
- 基本的に指定は増えない
- id や email、 password などだけ
短所
- 指定していないものは全て入り得る
上記を踏まえた上で $guarded を選んぶ理由
複数代入されることを期待しているデータは、モデルごとにあるのではなく、アクション毎 にあります。
また、↓のような クソコード が書かれている場合カラムが横に長く伸びたテーブルの場合指定漏れが起きる可能性があります。
$model->fill($request->all())->save();
↓のような場合のコードであればギリギリ許容されますが、そもそもの $fillable に漏れがあれば意味ありません。
$model->fill($request->only('foo', 'bar'))->save();
まとめ
- \$model->fill(\$request->all()) と言うクソコードを止めよう
- fill を防ぐのは Model の役目じゃない
- $fillable でも問題はないが、テーブルが横長になるほどツラくなる
$fillable のほうが便利でいい!な意見がありましたら是非教えてほしいです。