Laravelの「$fillable」の意味と使い方メモ

2024.12.23

laravelの「$fillable」について、いずれ混乱しそうなので概要をメモしておく。

$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 の設定は不要。

$guarded で除外するカラムだけ選択も可能

逆にis_admin以外のカラム(titleやbodyなど)に値を入れたいにいれたい場合は、下記のようにすればOK。

class Post extends Model
{
    use HasFactory;

    protected $guarded = [ 
        'is_admin',
    ];
}

カラム数が多いときは、上記のように除外するカラムだけ指定すればOKだ。

PIC UP