確認していただきたい箇所
日々の開発の中で、「1対多のリレーションはあるが、その中の“最新の1件だけ”を扱いたい」というケースは少なくありません。
例えばユーザーに紐づく履歴データの中から、直近の状態だけを取得したい場面などが挙げられます。
Laravelでは通常、1対多の関係データはHasManyで取得されることが多いと思いますが、そのままでは複数件が取得されてしまい、実装側で絞り込みを行う必要があります。
こうした課題に対して、よりシンプルに、かつ意図が明確な形で実装できるのが「latestOfMany」や「oldestOfMany」といった機能です。
本記事では、HasManyの関係を保ちながら、最新(または最古)の1件のみをHasOneとして扱う方法について、具体的なコード例を交えてご紹介します。
概要
リレーション先はHasManyだが、最新データを1件をリレーションとして処理したい場合に利用できます
テーブル
- ユーザ情報テーブル
- 履歴テーブル
ユーザ情報テーブル
履歴テーブル
HasOneにする処理
User.php
/**
* @return HasOne
*/
public function userLog(): HasOne
{
return $this->hasOne(related: UserLog::class, foreignKey: 'user_id', localKey: 'id')
->latestOfMany(column: 'execution_date');
}例) 山田太郎の最新の履歴は「2023-01-05」のデータが取得される
最も古いデータにする場合
/**
* @return HasOne
*/
public function userLog(): HasOne
{
return $this->hasOne(related: UserLog::class, foreignKey: 'user_id', localKey: 'id')
->oldestOfMany(column: 'execution_date');
}
まとめ
履歴などの1対多のデータのなかで最新、一番古いデータのみ欲しい場合に「latestOfMany」を利用することで、
1対多を1対1のデータとして処理することができます。
/assets/images/242549/original/0a5d15eb-e47d-4e4f-9002-ad7cc1b4778d.jpeg?1450256724)