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

Posted

技术标签:

【中文标题】Laravel Eloquent groupBy() 并且还返回每个组的计数【英文标题】:Laravel Eloquent groupBy() AND also return count of each group 【发布时间】:2013-09-03 04:38:36 【问题描述】:

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

这是我的两便士:

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

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

【问题讨论】:

【参考方案1】:

这对我有用:

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

【讨论】:

太棒了!只需将“浏览器”添加到选择中: select('browser', ...) 并获得所需的一切。你很好,你! youtube.com/watch?v=ravi4YtUTxo 谢谢。但是为什么它在与 User::select('country', DB::raw('count(*) as total')->otherMethods() 之类的模型一起使用时不起作用? +v.在控制器上使用 \DB 而不是 DB @AmitBera 你能解释一下原因吗?请 有什么特别的原因让你更喜欢DB::table('usermetas')->.. 而不是Usermeta::.. 吗?【参考方案2】:

这对我有用(Laravel 5.1):

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

【讨论】:

【参考方案3】:

谢谢安东尼奥,

我刚刚在末尾添加了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');

【讨论】:

谢谢。注意:应该删除 5.1 示例中的 ->all(),因为您已经列出了结果。 list() 已弃用并重命名为 pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0 如何在采摘后按总数排序并从中获取 10 高计数 我创建了 tnx usermetas::groupBy('browser') ->selectRaw('count(*) as total, browser') ->orderBy('total','DESC') ->skip (0)->take($number)->pluck('browser');【参考方案4】:

如果要获取collection、groupBy和count:

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

干杯!

【讨论】:

【参考方案5】:
    打开config/database.phpmysql连接设置中找到strict键 将值设置为false

【讨论】:

避免原始查询的完美方法! 搞乱你未来的 sql 代码的完美方式!并且不经过修改就无法在标准数据库上运行。【参考方案6】:

也可以这样工作,更整洁一些。 getQuery() 只返回底层构建器,它已经包含表引用。

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

【讨论】:

【参考方案7】:

试试这个

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

【讨论】:

虽然这可能会回答这个问题,但最好解释一下答案的基本部分,以及 OP 代码可能存在什么问题。 谢谢! havingRaw 位非常好,因为它还可以让您根据计数过滤掉您不想要的结果。当您想要进行一些“和过滤”并为每个过滤器连接时会派上用场。【参考方案8】:
$post = Post::select(DB::raw('count(*) as user_count, category_id'))
              ->groupBy('category_id')
              ->get();

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

这是一种更 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();

【讨论】:

这是内存和处理饥饿。 我的内存相同【参考方案11】:

如果你想得到排序的数据,也可以使用这个

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

【讨论】:

【参考方案12】:

Report::groupBy("student_id")->selectRaw("sum(total_marks) as sum,student_id")->orderByRaw("SUM(total_marks) DESC")->get();

【讨论】:

你可以edit你的答案是你犯了一个错误。另外,你可以 format your code 使用 markdown ! 请提供您的解决方案的口头解释,而不仅仅是代码。

以上是关于Laravel Eloquent groupBy() 并且还返回每个组的计数的主要内容,如果未能解决你的问题,请参考以下文章

GroupBy() 覆盖我的选择语句 Eloquent Laravel

Laravel Eloquent GroupBy 多对一关系

Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 将子查询与 GroupBY 左连接?

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

Laravel Eloquent groupBy orderBy 在 MariaDB 中给出不同的结果

Laravel 按 Eloquent 关系分组