fillableとhiddenはLaravelモデルで全く別の目的で使うプロパティです。それぞれの役割を具体例付きで説明します。
$fillableの役割(マスアサインメントのホワイトリスト)
「どのカラムなら、create/update時に一括代入を許可するか」を指定
class User extends Model
{
protected $fillable = ['name', 'email']; // この2つだけ代入OK
}
具体例:これが動く・動かない
// ✅ OK(fillableにあるから)
User::create(['name' => '太郎', 'email' => 'taro@example.com']); // 保存される
// ❌ 無視される(fillableにない)
User::create([
'name' => '太郎',
'email' => 'taro@example.com',
'password' => 'secret' // ← 保存されない!
]);
- *目的:**悪意あるユーザーによる
passwordやroleの書き換えを防ぐセキュリティ。
$hiddenの役割(JSON/配列変換時の非表示リスト)
「toArray(), toJson()時に隠すカラム」を指定
class User extends Model
{
protected $fillable = ['name', 'email', 'password'];
protected $hidden = ['password', 'remember_token']; // API出力から除外
}
具体例:API出力の見え方の違い
$user = User::create([
'name' => '太郎',
'email' => 'taro@example.com',
'password' => 'secret123'
]);
// APIで返す時
return $user; // JSON形式で返す
// ❌ hiddenがない場合(危険!)
{
"id": 1,
"name": "太郎",
"email": "taro@example.com",
"password": "secret123", ← パスワード丸見え!
"remember_token": "abc123..."
}
// ✅ hiddenありの場合(安全)
{
"id": 1,
"name": "太郎",
"email": "taro@example.com" ← パスワード非表示!
}
使い分けまとめ表
| プロパティ | 目的 | 影響する場面 | 例として含めない方がいいカラム |
|---|---|---|---|
$fillable |
マスアサインメント許可 |
create(), update(), fill()
|
password, role, is_admin
|
$hidden |
JSON/配列出力非表示 |
toJson(), toArray(), response()->json()
|
password, remember_token, pivot
|
実装例(Userモデル)
class User extends Model
{
// 1. create/updateで許可するカラム(セキュリティ)
protected $fillable = [
'name',
'email',
'password', // ハッシュ化は別途処理
];
// 2. API出力で隠すカラム(プライバシー)
protected $hidden = [
'password',
'remember_token',
];
// 3. 日付として扱うカラム
protected $dates = ['deleted_at'];
}