【问题标题】:How to groupby with count in laravel for multiple fields如何在laravel中对多个字段进行分组
【发布时间】:2018-03-14 08:15:07
【问题描述】:

我使用的是 laravel 5.4。想象一下,我想展示一些汽车广告。我将从表中获取所有汽车记录并将它们加载到我的页面中。现在我想在侧边栏中显示多个类别的计数(汽车类型、汽车颜色、汽车燃料),并且我想显示每个类别的计数。

例如:我们有 10 个汽车广告,其中两个是红色的,三个是绿色的,五个是白色的。我想在侧边栏中有这样的东西:

red(2)
green(3)
white(5)

我用SQL groupBy做到了:

        $colors = DB::table('advertisments')->select('color_name', DB::raw('count(color_name) as total_color'))->groupBy('color_name')->get();
        $gearboxes = DB::table('advertisments')->select('gearbox', DB::raw('count(gearbox) as total_gearbox'))->groupBy('gearbox')->get();
        $param = ['colors' => $colors,'gearboxes' => $gearboxes];
        return view('ads' , compact('ads','param'));

但是,我有几十个类别,我不能用一个 groupBy 来做,所以查询的数量会太多。 有没有办法用单个查询或更少的查询来做到这一点?

【问题讨论】:

  • 你想要什么?使用 group by 或 laravel 代码的 sql 查询?
  • 没关系,我只是想这样做。但我认为只有 sql 和 group by 才有可能

标签: php mysql sql laravel eloquent


【解决方案1】:
$allColors = Model::withCount(['advertisments_model', 'more_model', '...'])

【讨论】:

  • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
  • 如何与advertisments_model进行分组?
  • @MarkRotteveel 感谢我的建议
  • @RayCoder 谢谢你问我的重点。 Laravel 在构建方法中帮助我们,它在广告模型中设置了这样的雄辩关系: public function ads(){ return $this->belongsTo(product::class, 'id', 'product_id'); }
【解决方案2】:

您可以使用数组来轻松遍历不同的列。

$params = [];
$columns = [
    'colors' => 'color_name',
    'gearboxes' => 'gearbox',
    // put your other columns in this array
];

foreach($columns as $name => $column)
    $params[$name] = DB::table('advertisments')->select($column, DB::raw('count(' . $column . ') as total'))->groupBy($column)->get();

return view('ads' , compact('ads','param'));

【讨论】:

  • 谢谢。它的代码更少,但仍然是数十个查询。有什么办法可以减少查询??
  • 我不相信只要它是不同的列。您可以使用子查询,但这些仍然算作查询。您每次都会失去等待数据库响应的时间,但只要您的数据库与您的网络服务器位于同一台服务器或同一数据中心,我认为性能不会有巨大的提升。
  • 好的,我将通过多个分组来做到这一点,我认为这是最好的方式,而且还不错
  • 超级,那你会接受我的回答吗?您可以做的一件事就是以不同的方式构建您的表格,但这当然需要更多的工作。
  • 如果您有一个包含属性的关系表,其中包含一列来说明属性是什么,例如“颜色”,然后有一列包含值,那么您可以按两列分组。这样,您将在一个查询中获得所有计数。但这当然也意味着您的属性需要相同的列类型作为您的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多