4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】MassAssignmentExceptionへの処方箋

Posted at

#はじめに
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以外の属性は複数代入で保存することができません。

app/User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 複数代入する属性
     *
     * @var array
     */
    protected $fillable = ['name'];
}

##ブラックリストの設定は$guarded をモデルに定義する
次に、ブラックリストの設定方法について説明します。
下記の例では、Userモデルのid属性を保存されないようにしました
idは基本的にオートインクリメントで設定しているため自動で値が設定されます。
これで、id以外の属性は複数代入で保存できるようになりました。

app/User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 複数代入する属性
     *
     * @var array
     */
    protected $guarded = ['id'];
}

ちなみに、下記のように$guardedプロパティに空の配列にすると、全属性を複数代入可能になります

app/User.php
protected $guarded = [];

以上です!!!
ここまで読んでいただきありがとうございました!!
疑問、気になるところがございましたら、質問、コメントよろしくお願いします!!!

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?