Laravel Eloquent groupBy()AND各グループのカウントも返す


104

他の列の中で、ブラウザのバージョンの列を含むテーブルがあります。そして、私は単にレコードセットから、各タイプのブラウザの数を知りたいだけです。だから、私はこのようなもので終わる必要があります:Total Records:10; Internet Explorer 8:2; Chrome 25:4; Firefox 20:4(すべて合計で10)

これが私の2ペンスです。

$user_info = Usermeta::groupBy('browser')->get();

もちろん、これには3つのブラウザのみが含まれ、それぞれの数は含まれていません。これどうやってするの?

回答:


211

これは私のために働いています:

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

1
見事!このように、selectに 'browser'を追加しただけです:select( 'browser'、...)そして必要なものすべてを得ました。あなたは元気です、あなた!youtube.com/watch?v=ravi4YtUTxo
kJamesy 2013

ありがとう。しかし、User :: select( 'country'、DB :: raw( 'count(*)as total')-> otherMethods()などのモデルで使用すると機能しないのはなぜですか?
doncadavona

1
+ v。コントローラでDBの代わりに\ DBを使用する
Amit Bera

@AmitBera理由を説明できますか?、お願いします
JCarlosR

8
あなたが好む理由は、特定の理由があるDB::table('usermetas')->..以上Usermeta::..
Adam

33

これは私にとってはうまくいきます(Laravel 5.1):

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

22

おかげでアントニオ、

lists最後にコマンドを追加したので、キーとカウントを含む配列が1つだけ返されます。

ララヴェル4

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

Laravel 5.1

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

Laravel 5.2以降

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

1
ありがとう。注:5.1の例の-> all()は、すでに結果をリストしているため、削除する必要があります。
ピム

1
list()非推奨になり、名前がpluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0に
Arun Code

12

コレクション、groupBy、countを取得する場合:

$collection = ModelName::groupBy('group_id')
->selectRaw('count(*) as total, group_id')
->get();

乾杯!


9

そのように機能し、もう少し整頓されています。 getQuery()テーブル参照がすでに含まれている、基礎となるビルダーを返すだけです。

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


1

これでお試しください

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))

2
これは質問に答えるかもしれませんが、答えの本質的な部分と、おそらくOPsコードの問題点を説明する方が良いでしょう。
ピロー2017

1

生のステートメントを使用せずにgroup byを処理するためのよりLaravelの方法を次に示します。

$sources = $sources->where('age','>', 31)->groupBy('age');

$output = null;
foreach($sources as $key => $source) {
    foreach($source as $item) {
        //get each item in the group
    }
    $output[$key] = $source->count();
}

7
これはメモリと処理に飢えています。
doncadavona

私と同じメモリのページ
Vince

0

ソートされたデータを取得したい場合は、これも使用してください

$category_id = Post::orderBy('count', 'desc')->select(DB::raw('category_id,count(*) as count'))->groupBy('category_id')->get();

0
$post = Post::select(DB::raw('count(*) as user_count, category_id'))->groupBy('category_id')->get();

これは、カテゴリーごとの投稿数の結果の例です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.