Help us understand the problem. What is going on with this article?

LaravelのEloquentで、グループごとに日付が最新の行を取得したいときのテク

たとえば、サロンの予約テーブルがあるとしたら、
ユーザーごとに日付が最新の予約だけを取得したいときに使えるテク。

前提

// NGな例
$reservations = Reservation
    ::groupBy('user_id')
    ->selectRaw('user_id, max(visit_salon_time)')
    ->get();

みたいな感じで良さそうだが、これだとuser_idvisit_salon_timeしか取得できない。
集計が効かないカラムの取得には工夫が必要。

具体的な方法

別の書き方は複数存在するが、以下のコードはサブクエリが不要でシンプル。

$reservations = Reservation
    ::leftJoin(
        'reservations as reservations2',
        function ($join) {
            $join->on('reservations.user_id', 'reservations2.user_id')
                ->whereColumn('reservations.visit_salon_time', '<', 'reservations2.visit_salon_time');
        }
    )
    ->whereNull('reservations2.user_id')
    ->get();

ざっくり解説

同じテーブルを条件付きでleftJoinして、日付が最新の行はJoinされないようにする。
JoinされたテーブルのいずれかのカラムがNullであれば最新。

tatun55
ほんとうはたのしいです
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away