【Laravel】リクエストパラメータにコントローラで値を追加してEloquentでデータベースに保存する

laravel リクエストパラメータに追加

Laravelでstore()またはupdate()メソッドでリクエストパラメータをデータベースに保存するときに、リクエストパラメータだけでなく別の値も追加して保存したいときってありますよね。

たとえばこんなの。

function store(Request $request) 
{
  // ここで何か追加してからcreateしたい。
  User::create($request->safe()->all());
}

 

Eloquentのcreateなりsaveメソッドを呼び出す前に、何か追加する方法を教えます。

リクエストパラメータにコントローラで値を追加してEloquentでデータベースに保存する

たとえば、DBのカラムがcolorだったときにcontroller内でリクエストパラメータにはない値の “red” を追加したい場合を考えてみましょう。

ざっくりいえば方法は2通りあります。

Laravelのメソッドを使うのが1つ。もう一つはPHP標準の関数を使うこと。

LaravelのRequest::mergeメソッドを使う

function store(Request $request) 
{
  $request = $request->merge(['color' => 'red']);
  User::create($request->all());
}

Laravelの公式はこちら。

https://laravel.com/api/9.x/Illuminate/Http/Request.html#method_merge

僕はこっちは使っていません。

理由は後ほど。

PHP標準の関数や機能を使う方法

PHPだと配列は+で合体させることができます。

PHP公式ではあっさりとした解説ですがこちら

function store(Request $request) 
{
  $saveParam = $request->safe()->all() + ['color' => 'red'];
  User::create($request->safe()->all());
}

 

他にはarray_pusharray_mergeを使う方法もあります。

$saveParam = array_merge($request->safe()->all(), ['color' => 'red']);
$saveParam = $request->safe()->all();
$saveParam['color'] = 'red';

 

意味は全部同じです。

Laravelのメソッドで処理するのではなくPHP標準のメソッドで配列を合体すればいいだけです。

 

僕がPHP標準を使う理由

理由はたった1つで、$request->safe()を使いたいからです。

以下のようにsafeメソッドをはさむことで、validationを通ったパラメータのみを取得できます。

safeメソッドをはさむことで、画面からユーザが悪意を持ったパラメータを仕込んでいたとしてもFormRequestクラスで想定しているバリデーションのパラメータ以外を受け取らないのです。

$reqesut->safe()->all();

いっぽう、FormRequest::mergeメソッドはValidateor::validated()には入ってこないためデータベースに保存したいパラメータが揃わないのですよね。

ということでmergeメソッドを使っていません。