【问题标题】:Laravel Group & Count by Eloquent RelationshipLaravel Group 和 Eloquent 关系计数
【发布时间】:2019-02-04 06:57:19
【问题描述】:

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

我的问题

一个 用户拥有多个项目。 如何通过一次查询找到每个item_type 的用户有多少items?


这是我尝试过的:

类似的查询

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

返回此错误:

语法错误或访问冲突:1055 Expression #1 of SELECT list 不在 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 集合是空的。

是否可以按查询中的关系进行分组?

【问题讨论】:

    标签: php laravel laravel-query-builder


    【解决方案1】:

    有一个错误:

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

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

    如果可行,请删除 user_id 尝试一次,这样会更好。其次,当你有 groupby 时,你不能在 mysql 中选择非聚合列。该选项是在 mysql 配置中禁用 only_full_group_by。因此,除非您禁用此配置,否则 user_id 很可能也会失败

    【讨论】:

    • 感谢您发现错字,我已更正。我认为当我添加外键时你的权利会起作用。但是,我不想禁用only_full_group_by。不过还是谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2017-10-28
    • 2021-01-25
    • 2013-02-26
    • 1970-01-01
    • 2021-03-20
    • 2021-11-06
    相关资源
    最近更新 更多