【Laravel】読みやすく書きやすいコードのためのEloquentでレコードを作成、更新する方法

 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();
>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG