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

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

这是我的两便士:

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

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

【问题讨论】:

    标签: laravel laravel-4 eloquent


    【解决方案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】:
        1. 打开config/database.php
        2. mysql连接设置中找到strict
        3. 将值设置为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 !
                • 请提供您的解决方案的口头解释,而不仅仅是代码。
                猜你喜欢
                • 2016-12-07
                • 2020-12-03
                • 1970-01-01
                • 2022-01-21
                • 2016-02-18
                • 1970-01-01
                • 1970-01-01
                • 2017-07-23
                相关资源
                最近更新 更多