LaravelのEloquent(データベースの射影モデル)は雄弁な、と名がつく通り様々なことができます。できることが多いためある目的の達成方法がいくつもあります。この記事ではなるべく後からコードの変更が手間にならない方法を紹介します。
Eloquentでデータを作成、更新する時には主だって二つのやり方があります。一つが配列で一気にデータを定義する方法、もう一つが一つ一つデータを定義する方法です。それぞれ利点欠点があります。
配列で一気にデータを定義する方法は例えば次です。
$user->fill($request->validated())->save();
リクエストのバリデーションにはnameなど、ユーザが好きに操作できるカラムの名前がそのまま入っています。これの利点はfill, saveメソッドを呼んでいるコードがデータの中身が何なのか気にする必要がない点、一行でパパっと書ける点です。欠点は使い方が限られる点、この方法に固執するとarray操作が増え出してその内わけがわからなくなりやすい点です。配列を使っているけれど配列の利点を殺しているアンチパターンが次です。
$user->fill([ 'name' => $request->name ?? $user->name, 'email' => $request->email ?? $user->email, ])->save();
一つ一つ設定するので手間がかかります。そのうえキーはただの文字列なのでIDEによる置換も行いにくいです。
一つ一つ設定する利点を表すコードは次です。
$user = new User(); $user->name = $reqeust->name; $user->tel = $userRepository->hoge($request->repositoryKey)->tel; $user->save(); // User.php $fillable = ['name'];
複数の情報源からの代入が自然にできる点が最も大きい利点です。配列でこれをやると処理が煩雑になりがちです。また利点でもあり欠点でもあるのですが、fillableやguardsといったプロパティのルールをすんなり無視できます。これはデータを初期化した時に定まり、今後変更されることの値(例ならばtel)などを定義する時に便利です。欠点はコードが長くなりがちな点です。以下の様なコードが現れやすいです。
$user->name = $request->name; $user->email = $request->email; // ... // ... 省略 // ... // ... $user->birthday = $request->birthday; $user->save();