web-dev-qa-db-ja.com

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

他の列の中でも、ブラウザーバージョンの列を含むテーブルがあります。また、レコードセットから、各種類のブラウザがいくつあるかを知りたいだけです。そのため、次のような結果になる必要があります。Total Records:10; Internet Explorer 8:2; Chrome 25:4; Firefox 20:4.(すべて合計10まで)

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

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

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

77
kJamesy

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

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

これは私のために動作します(Laravel 5.1):

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

ありがとう、アントニオ、

最後に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();
17
Diogo Gomes

同じように機能します。 getQuery()は、テーブル参照を既に含んでいる基礎となるビルダーを返すだけです。

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

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

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

乾杯!

6
Adam Kozlowski
  1. config/database.phpを開く
  2. 検索strictキー内部mysql接続設定
  3. 値をfalseに設定します
4
Boris Tetřev

以下は、生のステートメントを使用せずにグループを処理する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();
}
1
Vulfoliac

GroupByの使用中に問題を数えました。だから私はやった:

$queryWithGroupBy->getQuery()->getCountForPagination(); //return int

$ queryWithGroupBy-> get()-> count()の問題は、結果をカウントする前にクエリが実行されることです。これは、count($ queryWithGroupBy-> get())を実行するだけなので役に立たないことです。

0
Umair Hamid

これで試してください

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