データベース上に登録してある項目から、表示するときに新しい項目が必要になったとき、例えば姓・名は登録してあるがフルネームとしては登録していない場合、Vue 側で以下のようにして書いていました。
const full_name = `${user.last_name} ${user.first_name}`;
このようにすると必要になったときに毎回この変数を用意しなければならなかったのですが、Laravel の Eloquent モデルで項目を追加してから渡すということができることを昨日知りました。
アクセサを用意して、appends
プロパティに配列として渡すことで実装できます。
フルネームを取得したい場合は以下のようになります。
protected $appends = [
'full_name',
];
public function getFullNameAtteribute() {
return "{$this->last_name} {$this->first_name}";
}
リレーションを使って別の項目を操作したい場合はアクセサがかなり役立ちます。
ユーザの所有するデバイスの数を管理するテーブルがあったとき、今までは、
return User::with('devices');
のようにして、フロント側で、
const count = user.devices.length();
と表示していましたが、この方法ではdevice
に関する必要ではない情報まで全て取得してしまうため
1 回での転送量が増えてしまいます。
アクセサを使うことで取得したいデータだけをuser
に追加することが可能になります。
protected $appends = [
'device_count'
];
public function getDeviceCountAtteribute() {
return $this->devices()->count();
}
SPA ではデータ通 j 信量を少なくして素早くレイアウトを構築することが重要なので、こういったデータ削減は特に必要になってきます。