メモ帳

読むな

Laravel の Eloquent ORM でサブクエリを作る

日付単位で number の合計が10以上のレコードのみを抽出する

データ

id target_date number
1 2021-09-01 1
2 2021-09-02 2
3 2021-09-01 3
4 2021-09-03 4
5 2021-09-04 4
6 2021-09-11 2
7 2021-09-06 5
8 2021-09-12 23
9 2021-09-12 10
10 2021-09-23 20

SQL

SELECT
    *
FROM
    samples
INNER JOIN(
    SELECT
        id,
        SUM(number) AS number_sum
    FROM
        samples
    GROUP BY
        samples.target_date
) AS samples1
ON
    samples1.id = samples.id
WHERE
    number_sum >= 10;

※numberはMySQL予約語かも

これを Laravel の Eloquent を使ってサブクエリで書く

<?php
$subQuery = Sample::selectRaw('sum(number) as number_sum')
    ->addSelect('id')
    ->groupBy('target_date');

Sample::joinSub($subQuery, 'samples1', 'samples1.id', 'samples.id')
    ->where([['number_sum', '>=', '10']])
    ->get(['samples.id', 'target_date', 'number_sum']);

joinSub は Eloquent じゃなくて QueryBuilder の機能だった

結果

id target_date number_sum
8 2021-09-12 33
10 2021-09-23 20

参考

github.com