Eloquentでcreateするときは割り当て許可が必要
Eloquentモデルを使ってcreateするときに、何も設定していないとMassAssignmentExceptionというエラーが出る。
【コントローラ側】
Comment::create(array('name' => 'John'));
【エラーメッセージ】
Illuminate \ Database \ Eloquent \ MassAssignmentException name
これはEloquentでMass Assignmentの設定をしていないからだ。Mass Assignmentは適当な日本語訳がない。Laravel4の日本語ドキュメントでは「複数代入」と訳している。本ブログではわかりやすさ優先で「割り当て許可」とする。
とにかくEloquentのcreateで割り当てようとする値は、あらかじめEloquent側で割り当て許可を与えなくてはいけない。面倒だけどこれはセキュリティ上の仕様だ。
割り当て許可の方法には、ブラックリスト方式とホワイトリスト方式がある。
【ブラックリスト方式】
class User extends Eloquent { protected $guarded = array('id', 'year'); }
上記のように$guarded変数に配列を設定した上でprotectedすれば、「id」と「year」以外の要素を、createから渡すことができる。ブラックリスト方式は$guarded(保護)を使う。
【ホワイトリスト方式】
class User extends Eloquent { protected $fillable= array('name','age'); }
割り当て許可を与えたい要素が少ないなら、ホワイトリスト方式もある。上記のように$fillable(代入可能)に配列を設定した上でprotectedすれば、「name」と「age」だけをcreateから渡すことができる。