2016-11-30 5 views
2

MassAssignmentExceptionエラーを生成しているLaravelのfirstOrNewメソッドを使用してデータを保存しようとしています。Laravel MassAssignmentException from firstOrNew by id

それは単に何かを保存しようとしていない、データベースでを見ているので、firstOrNew方法は、質量割り当ての例外をトリガすべき理由を私は理解していません。 the docsから:

firstOrNew方法、firstOrCreateのように指定された属性に一致するデータベース内 レコードを検索しようとします。ただし、 モデルが見つからない場合は、新しいモデルインスタンスが返されます。 firstOrNewによって返されたモデル がまだ データベースに保持されていないことに注意してください。

はなぜ、私のコードは、MAEを投げるべきである:データベースとの行がある場合

私が理解したよう
$tour = Tour::firstOrNew(array('id' => $this->request['id'])); 

は、すべてが上記のコードは基本的に「見て、見ていると言っていることそのIDがあればその行を返し、そうでない場合は、関連するプロパティを持つ新しいオブジェクトを作成します。データを保存していないので、問題は何ですか?

エラーは、行が存在しない場合にのみ発生することに注意してください。 ...それは、レコードを見つけられませんでしたあなたは何が起こっているのか、正確に言うテキストをコピーしたとある。

+1

を使用する$fillable配列を設定する必要があります。これはあなたのケースではうまくいくかもしれませんが、通常はIDの自動インクリメントであるため、特定のIDを作成したくありません。私はfirstOrオブジェクトを別の属性で宣言します。名前があればそれを取得し、そうでなければその名前でオブジェクトを作成します。また、より適切に聞こえるfindOrFailを調べることも考えられます。https://laravel.com/docs/5.3/eloquent#retrieving-single-models - このIDを持つオブジェクトは存在しますか?もしそれが得られれば、そうでなければ例外をスローする – Djave

+0

おかげさまで、おそらく 'findOrFail'は適切ではないでしょう。 IDは確かに自動インクリメントであり、唯一のユニークなカラムであり、私はなぜそれを使いたいのですか?これをどうやって行うのかわからない。... – Inigo

+0

ええ、聞いている。 Alexey Mezeninの答えは、失敗した理由をすべて網羅しています。あなたが簡単に乗ることを望むなら、私はかなり確信しています。$ tour = Tour :: find($ this-> request ['id']); if(!$ tour)$ tour = new Tour; 'は本当に同じ場所に行かなくても苦労するでしょう。がんばろう! – Djave

答えて

4

firstOrNew() NEW

firstOrNewは...コンストラクタを使用して新しいモデルを作成しnewInstance()を使用しています。 Constructor uses fill()方法は、Mass Assigmentです。だからあなたが例外を取得している理由です。

だから、あなたはあなたがIDを使用して、オブジェクトを作成しようとしているfirstOrNew()

+1

ああ、OK。 *コンストラクタは、大量詰め物であるfill()メソッドを使用します。*それは私が推測する鍵です。 – Inigo

1

MassAssignmentExceptionあなたが充填可能なまたはモデルに

$guarded = []; 
$fillable = ['explicitlydefinedfield']; 

PSを定義した警備フィールドを持っていない場合に発生します新しいものを作成しようとしています。

+0

ありがとう、私は 'guarded'属性と' fillable'属性を設定しているのを知っていますが、なぜデータが永続化されていない(つまり保存されていない)のかを理解していません – Inigo

+0

次の答えそのことをよりうまく対処した: –