Laravel按口才关系分组和计数

时间:2019-02-03 22:11:31

标签: php laravel laravel-query-builder

我知道这里曾有人问过这个问题:Laravel Grouping by Eloquent Relationship,但答案来自2016年,似乎在2019年不起作用。我的问题也更简单,因为我只需要一个关系级别。 >

我的问题

A  用户有多个项目。  如何通过一个查询查找每个items用户有多少item_type


这是我尝试过的:

类似的查询

User::with(['items' => function($q){
  $q->groupBy('type');
});

返回此错误:

  

语法错误或访问冲突:1055 SELECT列表的表达式#1   不在GROUP BY子句中,并且包含未聚合的列'items.id'   在功能上不依赖于GROUP BY子句中的列;   这与sql_mode = only_full_group_by

不兼容

我尝试通过以下查询解决此错误:

User::with(['items' => function($q){
    $q->select('type', \DB::raw('count(*) as total'))
          ->groupBy('type');
});

但是,这将返回users的集合,其中每个用户的item集合为空。

是否可以通过某种方式对查询中的关系进行分组?

1 个答案:

答案 0 :(得分:2)

有错误:

您使用$ q作为闭包参数,而内部使用$ query。有时我也遇到一个问题,我必须在关系查询闭包内部传递外键才能获得结果:

/$uid/my_friend_id

通过删除user_id尝试一次(如果可行),这样更好。其次,当您具有groupby时,不能在mysql中选择非聚合列。在mysql配置中,该选项禁用<?php $userWithItems = User::with(['items' => function($q){ $q->select('type', \DB::raw('count(*) as total'), 'user_id') ->groupBy('type'); }); 。因此,除非禁用此配置,否则很有可能user_id也将失败