LoginSignup
11
3

More than 1 year has passed since last update.

LaravelのEloquentに $fillable でなく $guarded を使う

Posted at

はじめに

今回は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 のほうが便利でいい!な意見がありましたら是非教えてほしいです。

11
3
0

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
11
3