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

Laravelを使った開発において、モデルの$fillable
プロパティは非常に重要な役割を持っています。しかし、テストケースでIDを明示的に指定したい場合など、実運用とは少し異なるニーズも出てきます。この記事では、$fillable
の基本から、テスト時にIDを指定するケースまで、分かりやすく徹底解説します!
$fillableとは?
$fillable
は、Laravel Eloquentモデルで一括代入(Mass Assignment)が許可される属性(カラム)を定義するためのプロパティです。
例えば、次のように設定します。
class User extends Model
{
protected $fillable = [
'name',
'email',
'password',
];
}
この場合、name
、email
、password
だけが一括代入可能になります。
// これは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'],
]);
このとき、$fillable
にid
を入れていなくても問題ありません!
理由は、Factory経由のデータ挿入時にはMass Assignment制約が適用されないからです。つまり、fillable
やguarded
の影響を受けず、どんなカラムでも自由に設定できます。
注意:本番環境の通常運用では、IDの明示指定は避けるべきです。あくまでテスト専用のテクニックです。
まとめ
項目 | 内容 |
---|---|
$fillable とは? | 一括代入できるカラムをホワイトリストで管理する仕組み |
id を入れるべき? | 通常は入れない(セキュリティ・一貫性のため) |
FactoryでID指定する時は? | $fillable に関係なく自由に指定可能 |
本番運用では? | IDはDBに任せ、自動生成に任せるのが基本 |
最後に
Laravel開発では、セキュリティと利便性を両立させることが大切です。$fillable
の正しい理解と運用は、そのための基本中の基本。特にテストコードでは、IDを明示的に指定しても問題ないことを理解しておくと、より柔軟なテスト設計ができるようになります。
これからLaravelのテストを書くあなたも、ぜひ今日からこの知識を活用してみてください!

大阪のエンジニアが書いているブログ。
コメント