Laravel EloquentのGroupByまとめ

Laravel EloquentのGroupByまとめ

LaravelのEloquentでGroupByの使い方について、まとめたいと思います。

まずはデータアクセス方法を整理

Laravelはデータソースに対するデータアクセス方法として、Eloquent(ORM)とクエリビルダが用意されています。
クエリビルダは取得結果をCollectionとして返却します。
Eloquentは取得結果をCollectionを継承したEloquent\Collectionを返却します。

返却されるクラスは、両方ともCollectionを含むので同じように扱うことが出来る反面、
異なるデータアクセス方法で取得しているという意識が薄れがちです。

EloquentでGroupBy

以前のMySQLはGroup対象ではないカラムをSELECT句に追加しても何が取得されるか保証はないけれど動くという緩い仕様でした。
本来GroupByはGroup対象に指定したカラムのみSELECT句に含み、あとは集約関数を追加します。

集約関数は、DB::rawで直接SQL文を記載することになります。
個人的にはORMを使っていながらSQLを直書きするのは抵抗がありますが、仕方がありません。

$user_info = Usermeta::groupBy('browser')
->select('browser', DB::raw('count(*) as total'))
->get();

クエリビルダでGroupBy

クエリビルダで記載する場合も基本的に変わりません。

$user_info = DB::table('usermetas')
->select('browser', DB::raw('count(*) as total'))
->groupBy('browser')
->get();

groupByに複数キーを指定する

groupByメソッドは可変長引数に対応しています。
複数引数を指定したり、配列で指定することが出来ます。

groupBy('browser', 'name')
groupBy(['browser', 'name'])

プログラミングカテゴリの最新記事