#はじめに
MassAssignmentExceptionは新しくModelクラスを作成して、複数代入してデータをDBに保存しようとすると起こるエラーです。Laravel初心者の時はモデルを作成し時は必ず起きていました。。。
##複数代入時の問題点
複数代入でDBに保存するメソッドはcreate
があります。
createメソッドを使う時は下記のようなコードになるかと思います。
$user =User::create($request->all());
これではフォームからの入力値を完全に信じて保存処理を行いますので、
入力フォームにない項目でもDBに該当する属性があれば保存されてしまいます。
だからLaravelでは「新しく作成したModelクラスから複数代入で属性(カラム)を保存しようとしていますが、その属性(カラム)を保存していいのかわかりません」というエラーを出るようになっています。
##どうすればいいか
上記のことから、やらなければならないことは「保存していい属性(カラム)のリスト(ホワイトリスト)か保存してはいけない属性(カラム)のリスト(ブラックリスト)を設定する」です
例えばこの設定をしてない場合、あるユーザーを管理者(administrator)に昇格できてしまいます。
その方法はHTTPパラメータでis_adminパラメーターを送り、モデルのcreateメソッドに対して渡すことで、ユーザーを管理者に昇格させます。それはとてもまずい
#リストの設定はモデルにプロパティを定義するだけ
では次に、実際の設定方法について説明します。
ホワイトリスト、ブラックリストともに設定方法はほとんど同じです。
下記のようにモデルクラスに$fillable、$guardedプロパティを定義します。
注意することは$fillableと$guardedは両方設定することはで来ません。どちらか1つだけ定義するようにしてください。
##ホワイトリストの設定は$fillable
をモデルに定義する
まず、ホワイトリストの設定方法について説明します。
下記の例でUser
モデルに対してname
属性を複数代入で保存できるようにしました
name
以外の属性は複数代入で保存することができません。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 複数代入する属性
*
* @var array
*/
protected $fillable = ['name'];
}
##ブラックリストの設定は$guarded
をモデルに定義する
次に、ブラックリストの設定方法について説明します。
下記の例では、User
モデルのid
属性を保存されないようにしました
id
は基本的にオートインクリメントで設定しているため自動で値が設定されます。
これで、id
以外の属性は複数代入で保存できるようになりました。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 複数代入する属性
*
* @var array
*/
protected $guarded = ['id'];
}
ちなみに、下記のように$guardedプロパティに空の配列にすると、全属性を複数代入可能になります
protected $guarded = [];
以上です!!!
ここまで読んでいただきありがとうございました!!
疑問、気になるところがございましたら、質問、コメントよろしくお願いします!!!