Laravel $fillableとは?テスト時にIDを指定するケースも含めて徹底解説!

Laravel $fillable PHP
この記事は約4分で読めます。

この記事の最終更新日: 2025年4月29日

Laravel $fillable

Laravelを使った開発において、モデルの$fillableプロパティは非常に重要な役割を持っています。しかし、テストケースでIDを明示的に指定したい場合など、実運用とは少し異なるニーズも出てきます。この記事では、$fillableの基本から、テスト時にIDを指定するケースまで、分かりやすく徹底解説します!


$fillableとは?

$fillableは、Laravel Eloquentモデルで一括代入(Mass Assignment)が許可される属性(カラム)を定義するためのプロパティです。

例えば、次のように設定します。

class User extends Model
{
    protected $fillable = [
        'name',
        'email',
        'password',
    ];
}

この場合、nameemailpasswordだけが一括代入可能になります。

// これはOK
User::create([
    'name' => 'John',
    'email' => 'john@example.com',
    'password' => 'secret',
]);

// fillableにないカラムは無視される or エラーになる
User::create([
    'is_admin' => true, // fillableにないので無視される
]);

なぜ必要なのか?

一括代入脆弱性(Mass Assignment Vulnerability)を防ぐためです。悪意のあるユーザーが意図しないフィールド(例えばis_adminなど)をリクエストに含めて不正に権限昇格するリスクを防ぎます。


$fillableにidを入れるべきか?

基本的に、主キー(通常はid)は$fillableに含めない方が安全です。

理由はシンプル:

  • IDを自由に指定できると、データの一貫性やセキュリティに悪影響を与える可能性がある
  • Laravelやデータベース側でIDは自動的に管理されるのが前提になっている

そのため、通常の運用では、id$fillableに含めず、モデル作成時もIDを明示的に指定する必要はありません。


では、テストケースでIDを指定したい場合は?

テストコードでは、データを分かりやすく管理するために、IDを明示的に指定したいケースが出てきます。

例えば:

Staff::factory()->createMany([
    ['id' => 1, 'name' => 'スタッフ1'],
    ['id' => 2, 'name' => 'スタッフ2'],
    ['id' => 3, 'name' => 'スタッフ3'],
]);

このとき、$fillableidを入れていなくても問題ありません!

理由は、Factory経由のデータ挿入時にはMass Assignment制約が適用されないからです。つまり、fillableguardedの影響を受けず、どんなカラムでも自由に設定できます。

注意:本番環境の通常運用では、IDの明示指定は避けるべきです。あくまでテスト専用のテクニックです。


まとめ

項目内容
$fillableとは?一括代入できるカラムをホワイトリストで管理する仕組み
idを入れるべき?通常は入れない(セキュリティ・一貫性のため)
FactoryでID指定する時は?$fillableに関係なく自由に指定可能
本番運用では?IDはDBに任せ、自動生成に任せるのが基本

最後に

Laravel開発では、セキュリティと利便性を両立させることが大切です。$fillableの正しい理解と運用は、そのための基本中の基本。特にテストコードでは、IDを明示的に指定しても問題ないことを理解しておくと、より柔軟なテスト設計ができるようになります。

これからLaravelのテストを書くあなたも、ぜひ今日からこの知識を活用してみてください!

クリックしたら、
楽天モバイル大盤振る舞いのキャンペーン中らしいです (本ブログ管理人は楽天モバイル2台持ちです) 楽天モバイル
PHP
daigoroをフォローする

コメント

タイトルとURLをコピーしました