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だと配列は+
で合体させることができます。
function store(Request $request)
{
$saveParam = $request->safe()->all() + ['color' => 'red'];
User::create($request->safe()->all());
}
他にはarray_pushやarray_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メソッドを使っていません。