LaravelのModelの【guarded】について勘違いしていた件
LaravelのModelの【guarded】について勘違いしていた件
# app/Models/User.php
....
protected $guarded =[
'id',
'uuid',
'email'
];
はい、これ間違いスクリプトです。guardedにemailが存在する事、無いとは言えませんが、まぁほぼ無いでしょう。
チームに迷惑かけた私の理解不足。
いやぁ、申し訳ない。
guarded = 複数代入禁止項目の設定
この認識はあったんですよね。
で、個別に登録しなくてはいけない内容で「バリデーションのような機能を持たせることができる」と私なりの解釈をしていました。
これが間違えたスクリプトを書く原因になりました。
真実は【複数代入禁止項目の設定】でそれぞれが独立して格納されなくてはいけない値との意味になります。
※詳細はこちらから
これを私は、guardedに記載したものとそれ以外のもので分けて格納すれば良いと勘違いしました。
【ブラックリスト方式】
class User extends Eloquent {
protected $guarded = array('id', 'year');
}
上記のように$guarded変数に配列を設定した上でprotectedすれば、「id」と「year」以外の要素を、createから渡すことができる。ブラックリスト方式は$guarded(保護)を使う。
※上記参照サイトからの転載です。
逆を言えば、id/yearの要素はCreateから渡すことができない。
つまりは、自動的に作られる値以外はguardedした以上交通整備が必要になる。
Createなんだけど、guardedしててもFakerからは記載できる
これがあったので私も勘違いをしていました。
Factoryに書いたルールで生成するんだもん。
でも、Controllerからアクセスすると [ Illuminate \ Database \ Eloquent \ MassAssignmentException ] と怒られるのでご注意ください。
まとめ
protected $guarded =[ 'id', 'uuid', ];
こうすると動きます。
なるほどなぁ〜。
Laravelは使いこなせると自信持ってたけど「まだまだだなぁ」と実感した一件でした。


