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;
これを 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 |
参考
株式会社エイルシステムではWebエンジニア・モバイルアプリエンジニアを募集しています。
実務経験がなくてもOKです。ご興味のある方は弊社HPよりご連絡ください。