laravelの「$fillable」について、いずれ混乱しそうなので概要をメモしておく。
Table of Contents
$fillableの概要
$fillableは外側、いわゆるフォームなどのフロント部分からDBのカラムなどにデータを入れる際に、挿入する項目を指定するという物。
class Post extends Model
{
use HasFactory;
protected $fillable = [//fillableは、「このカラムには外データを入れていいよ!」と指定するリスト。
'title',
'body',
];
}
これにより、titleとbodyには外側からデータを入れる許可がされたということ。
ちなみに、コマンドでカラムにデータを直接入れる場合は不要。
悪意あるデータの一例
外側(フォーム)などからデータを入れる場合、下記のように管理者権限の変更もリクエストされる可能性がある。
"title": "新しい投稿",
"body": "これは投稿本文です。",
"is_admin": false
悪意のあるユーザーがこの”is_admin”のリクエストデータをtrueにして送信すると、管理者権限が付与されてしまう。
これを避けるために、$fillableでフロント側からDBへ入れられるデータを制限する必要があるのだ。
$fillableを書かないと挿入・更新ができない
そもそも、Laravelでは$fillable を定義しないと、create() や update() を使ったマスアサインメント操作がエラーになる。
Illuminate\Database\Eloquent\MassAssignmentException
これは、「どのカラムにデータを入れていいかわからない」 ため、Laravelが安全のために操作を拒否している状態だ。
そのため、データの挿入、更新をするときは必ず定義する必要がある。
逆に、コマンドやPHPコード内で直接カラムを操作するだけなら $fillable
の設定は不要。
除外するカラムだけ選択も可能
逆にis_admin以外のカラム(titleやbodyなど)に値を入れたいにいれたい場合は、下記のようにすればOK。
class Post extends Model
{
use HasFactory;
protected $guarded = [
'is_admin',
];
}
カラム数が多いときは、上記のように除外するカラムだけ指定すればOKだ。