タイトル: Add [~] to fillable property to allow mass assignment on [App\~].
SEOタイトル: Add [~] to fillable property to allow mass assignment on [Ap
| この記事の要点 |
|---|
|
エラー内容
| Add [~] to fillable property to allow mass assignment on [App\~]. |
Laravelで Eloquent モデル経由でレコードを作成・更新するとき、Model::create([...]) や Model::fill([...]) のような マスアサインメント を行った際に出るエラーです。Eloquent は意図しないカラムへの一括代入を防ぐため、対象カラムを fillable プロパティで明示する必要があります。
発生条件
Model::create(['name' => '...', 'email' => '...'])のように、配列で複数カラムを渡して保存している- 渡したキーが、モデルの
$fillable配列に登録されていない - 同じく
fill()、update()、firstOrCreate()、updateOrCreate()でも発生する
対処法
1. モデルに $fillable を追加(推奨)
マスアサインメントを許可するカラムをモデルに明記します。
|
// app/Models/User.php |
エラーメッセージ Add [~] to fillable property の ~ がここに追加すべきカラム名です。
2. $guarded を使う書き方
逆に「これだけは一括代入を禁止する」スタイルもあります。空配列にすると全カラム許可になります。
|
protected $guarded = ['id']; |
3. 1カラムずつ代入する(一時的)
急ぎで動かしたい場合、マスアサインメントを避ければエラーは出ません。
|
$user = new User(); |
$fillable と $guarded の使い分け
| プロパティ | 意味 | 適している場面 |
|---|---|---|
$fillable | 許可するカラムのホワイトリスト | セキュリティ重視。基本これが推奨 |
$guarded | 許可しないカラムのブラックリスト | カラム数が多くて列挙が現実的でない場合 |
注意点
$guarded = []はマスアサインメントを完全に開放する設定。ユーザー入力をそのままcreate($request->all())に渡す前にバリデーションでカラムを絞ること- 新規カラムを追加したら
$fillableも更新するのを忘れない id、created_at、updated_atは通常$fillableに含めない