Laravel – マスアサインメント

概要

  • マスアサインメントによって、フォームからPOSTされたパラメーターを一括してモデルの属性にセットして、データベースに書き込める
  • ただしセットできる属性をモデルの$fillable配列に限定列挙する必要がある
  • モデルのインスタンス生成時に、セットできるパラメーターをonlyメソッドで限定列挙できる
  • $fillableのほかに$guarded配列も指定できて、こちらは指定した属性をモデルのセットの際に排除する

準備

以下のようなフォームがあって、namecommentをPOSTする。

POSTはコントローラーのstore()メソッドにルーティングされる。

ルーティング先のコントローラーでは、モデルのインスタンスを生成し、その属性にPOSTされたパラメーターをセットしてデータベースに書き込む。

マスアサインメント

Requestのall()メソッド

Request引数のall()メソッドで得られる内容を確認。

CSRF対策のトークンを含んだパラメーターの配列が得られる。

$request->all()の結果を、モデルインスタンスのfill()メソッドによって属性にセット。dd()で内容を確認してみる。

エラー。

マスアサインメントのためにはfillable属性に加えなければならないと言われる。

モデルの$fillableプロパティー

モデルの定義で、$fillable配列に取得したいプロパティーを列挙する。

先ほどのコードの実行結果。エラーがなくなる。dd()でプロパティーがセットされたインスタンスの内容を確認。

  • fillableプロパティーに2つのパラメーター名がセットされている
  • attributesに属性とその内容が配列としてセットされている
  • guardedは指定しておらず、サイズ1、内容'*'の配列となっている

以上を踏まえて、fillableがセットされたモデルのマスアサインメントとデータベース登録を以下に例示。

マスアサインメントの記述方法

マスアサインメントの書き方には複数あって、同じ結果が得られる。create()スタティックメソッドは、インスタンスの生成とデータベースの書き込みを一つのメソッドで行う。

Requestのonly()メソッドによる限定

意図しないパラメーターの追加を避けるため、all()メソッドではなくonly()メソッドでパラメーターを限定列挙できる。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です