Laravel Eloquent groupBy()AND也返回每组的计数

时间:2013-08-30 12:35:30

标签: laravel laravel-4 eloquent

我有一个表,其中包含一列浏览器版本。我只是想从记录集中了解每种类型的浏览器有多少。所以,我需要最终得到这样的结果:总记录:10; Internet Explorer 8:2; Chrome 25:4; Firefox 20:4。(所有加起来都是10)

这是我的两便士:

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

当然,它只包含3个浏览器,而不是每个浏览器的数量。我怎么能这样做?

12 个答案:

答案 0 :(得分:149)

这对我有用:

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

答案 1 :(得分:24)

这对我有用(Laravel 5.1):

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

答案 2 :(得分:17)

谢谢安东尼奥,

我刚刚在最后添加了lists命令,因此它只会返回一个带有键和计数的数组:

  

Laravel 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();

答案 3 :(得分:9)

也是这样,更整洁一点。 getQuery()只返回已包含表引用的基础构建器。

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

答案 4 :(得分:6)

如果要收集,请按groupBy进行计数:

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

干杯!

答案 5 :(得分:4)

  1. 打开config/database.php
  2. strict 连接设置内找到 mysql
  3. 将值设置为 false

答案 6 :(得分:1)

这是一种更加Laravel处理group by的方法,无需使用原始语句。

$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 :(得分:0)

试试这个

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

答案 8 :(得分:0)

使用groupBy时出现计数问题。所以我做到了:

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

$ queryWithGroupBy-> get()-> count()的问题在于,查询是在对结果计数之前执行的,这是没有用的,因为您只可以进行count($ queryWithGroupBy-> get())。

答案 9 :(得分:0)

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

这是一个按类别计算帖子数的示例。

答案 10 :(得分:0)

如果您想获得排序的数据,也请使用

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

答案 11 :(得分:0)

Laravel 版本 8

去除了DB的依赖

     $counts = Model::whereIn('agent_id', $agents)
        ->orderBy('total', 'asc')
        ->selectRaw('agent_id, count(*) as total')
        ->groupBy('agent_id')
        ->pluck('total','agent_id')->all();