Laravelでモデルの複数カラムを一気にセットしたいとき、fill()メソッドを使うと便利です。
入力フォームのname属性をカラム名と同じにしておくと、「$model->fill($request->all())
」とするだけで一気にセットできます。
ということを、上記の記事でさらっと紹介したのですが、「laravel fill」「laravel fill model」といったキーワードで訪問される方がいらっしゃいましたので、モデルの複数カラムを一気にセットする方法を記事にしました。
一気にセットする対象のモデル
下記のモデルを例に解説します。
カラム名 |
name |
password |
完成形
最初に完成形をご紹介します。
入力フォーム
<form action="/register" method="POST">
@csrf
<input type="text" name="name">
<input type="text" name="email">
<input type="text" name="password">
</form>
コントローラー
<?
use App\Model\User ;
public function register(Request $request)
{
$user = new User;
$user->fill($requesst->all()) ;
}
以降、順を追って解説します。
入力フォーム
モデルの複数カラムを一気にセットするためには、form内のinputエレメントのname属性の値を、カラム名と同じ値にします。
Userモデルの各カラムは「name」「email」「password」なので、name属性「name」「email」「password」のinputエレメントを用意します。
<form action="/register" method="POST">
@csrf
<input type="text" name="name">
<input type="text" name="email">
<input type="text" name="password">
</form>
コントローラー
値セット方法の基本
モデルへの登録は、コントローラーに記述します。
inputエレメントの値は、下記のように$request->{name属性の値}でアクセスができます。
$request->name ;
$request->email ;
$request->password ;
また、モデルの各カラムは、下記のように${モデルオブジェクトの変数名}->{カラム名}でアクセスができます。
<?
use App\Model\User ;
public function register(Request $request)
{
$user = new User;
/**
* User
* @param id
* @param name
* @param email
* @param password
*/
$user->name = "名前" ;
$user->email => "mailaddress@example.com" ;
$user->password => "password" ;
]) ;
}
したがって、モデルの各カラムにinputエレメントの各値をセットするのは、下記のように記載することで実現できます。
<?
use App\Model\User ;
public function register(Request $request)
{
$user = new User;
/**
* User
* @param id
* @param name
* @param email
* @param password
*/
$user->name = $request->name ;
$user->email => $request->email ;
$user->password => $request->password ;
]) ;
}
モデルの各カラムへの一括セット(1)
モデルに値を一括でセットするためには、fillメソッドを使用します。
<?
use App\Model\User ;
public function register(Request $request)
{
$user = new User;
/**
* User
* @param id
* @param name
* @param email
* @param password
*/
$user->fill([
'name' => $request->name,
'email' => $request->email,
'password' => $request->password
]) ;
}
モデルの各カラムへの一括セット(2)
すべてのinputエレメントの名前がモデルのカラム名と同じだと、$request->all()を利用することで一括セットできます。
<?
use App\Model\User ;
public function register(Request $request)
{
$user = new User;
/**
* User
* @param id
* @param name
* @param email
* @param password
*/
$user->fill($requesst->all()) ;
}
まとめ
入力フォームのname属性の工夫が必要ですが、ソースコードにカラム名を記載しなくなるため、モデルの拡張にコントローラーが影響しなくなるメリットがあります。
以上、参考になればうれしいです。