Laravel Eloquent groupBy()并且还返回每个组的计数


104

我有一个表,其中除其他列外,还包含浏览器版本的列。我只是想从记录集中知道每种浏览器有多少种。因此,我需要得出这样的结论:Total Records:10; Internet Explorer 8:2;铬25:4; Firefox 20:4。(总共加起来为10)

这是我的两便士:

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

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

Answers:


211

这为我工作:

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

1
高超!只需在选择中添加“浏览器”即可:select('browser',...)并获得所需的一切。你很好,你!youtube.com/watch?v=ravi4YtUTxo
kJamesy

谢谢。但是,当与User :: select('country',DB :: raw('count(*)as total')'>-> otherMethods()之类的模型一起使用时,为什么它不起作用?
doncadavona

1
+ v。在控制器上使用\ DB而不是DB
Amit Bera

@AmitBera您能解释原因吗?,请
JCarlosR

8
有什么特别的原因,你喜欢DB::table('usermetas')->..Usermeta::..
亚当

33

这对我有用(Laravel 5.1):

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

22

谢谢安东尼奥,

我刚刚在lists命令末尾添加了命令,因此它将仅返回一个包含key和count的数组:

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

1
谢谢。注意事项:5.1示例中的-> all()应该删除,因为您已经列出了结果。
Pim

1
list()已弃用,pluck() 并重
Arun代码

12

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

$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代码的问题所在。
pirho

1

这是一种无需使用原始语句即可处理分组依据的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

对我来说相同的内存铅
文斯

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.