この記事ではLaravelのクエリビルダ初級者向けにgroupByとSUMで集計結果を解説していきます。
バージョンは6系です。
ブログで以下のような記事も書いています。
取得するデータについて
今回の取得するデータは以下の通りです。
studentsテーブルのpost_idでグループ化し、amountの合算値を取得したいって場合。
同じpost_idをまとめて、amountを合算します。
イメージとしては、以下です。
post_id | amount |
---|---|
1 | 1000 |
2 | 2000 |
3 | 3000 |
1 | 5000 |
↓
post_id | amount |
---|---|
1 | 6000 |
2 | 2000 |
3 | 3000 |
SQLで書くと以下のようになります。
SELECT
post_id,
SUM(amount) AS total_amount
FROM students
GROUP BY post_id
これをクエリビルダにすると以下になります。
$result = DB::table('students')
->select('post_id')
->selectRaw('SUM(amount) AS total_amount')
->groupBy('post_id')
->get();
コードを解説
DB::table('students')
は、テーブルを指定。
selectRaw
select('post_id')
SELECT文。post_idをセレクトする。
selectRaw('SUM(amount) AS total_amount')
について。
selectRaw
とは、select(DB::raw(...))
の省略形です。
DB::raw()
とは、SQLを直接使用できるものです。ただ、生のSQLを書くことはセキュリティの面で心配なので、積極的には利用しない方がいいんですよね。
だけど、SUM関数などをクエリビルダで書くときは、selectRaw
を使う方法しかないですよ。
※もしあればコメントでお知らせください。
AS total_amount
でtotal_amountというカラム名に変更してます。
groupBy
groupBy('post_id')
でpost_idをグループ化してます。
これにより、post_id
が1,2,3,1→1,2,3になります。
最後にget()
でデータを取得してます。
中で行っていることとしては、
post_id amount
1 1000
2 2000
3 3000
1 5000
これを
1 6000
2 2000
3 3000
にまとめたって感じですね。
ビューで以下のように書けば、データを取得できます。
<table>
<thead>
<tr>
<th>投稿ID</th>
<th>合計金額</th>
</tr>
</thead>
<tbody>
@foreach ($result as $val)
<tr>
<td>{{ $val->post_id }}</td>
<td>{{ $val->total_amount }}</td>
</tr>
@endforeach
</tbody>
</table>
今回はここまでです。
参考になりましたらLGTMや記事のストックをお願いいたします。
ブログで以下のような記事も書いているのでぜひ一読してみてくださいね!