具有计数关系的 Laravel 查询构建器

Posted

技术标签:

【中文标题】具有计数关系的 Laravel 查询构建器【英文标题】:Laravel querybuilder withCount relationship 【发布时间】:2021-08-31 09:51:44 【问题描述】:

我遇到了脚本问题。 我正在使用 Laravel 6.x(但没有太大区别)。

所以,我有一个模型Order,它与另一个模型Group 有这样的关系:

型号顺序:

public function groups()

    return $this->hasMany('App\Models\Order\Group', 'order_id')->orderBy('order_group');

模型组:

public function order()

    return $this->belongsTo('App\Models\Order\Order', 'order_id');

我希望所有 Orders 都有一个组,其中组内的列 'is_recurrent'true 并且至少有 2 行 'is_recurrent' true

基本上是这样的:

$orders = Order::withCount(['groups' => function ($query) 
    $query->where('is_recurrent', true);
])
->having('groups_count', '>', 1)
->get();

我尝试了一些简单的东西,比如 Order::whereHas('groups', function ....)。

在很多情况下我得到了:

SQLSTATE[42803]:分组错误:7 错误:列“ordergroups.order_group”必须出现在 GROUP BY 子句中或用于聚合函数 第 1 行:... "is_recurrent" = $1 group by "order_id" order by "order_gro... ^ (SQL: select "orders"., (select count() from "ordergroups" where "orders"."id" = "ordergroups"."order_id" and "is_recurrent " = 1 个由 "order_id" 组成的组 order by "order_group" asc) 作为 "groups_count" 来自具有 "groups_count" > 1 order by "created_at" desc 的 "orders"

$orders = Order::withCount(['groups' => function ($query) 
    $query->where('is_recurrent', true)->groupBy('order_group');
])
->having('groups_count', '>', 1)
->get();

我明白了:

SQLSTATE[42703]:未定义列:7 错误:列“groups_count”不存在 第 1 行:...roup" asc) 来自具有 "groups_co... 的 "orders" 中的 "groups_count" ^ (SQL: select "orders"., (select count() from "ordergroups" where "orders"."id" = "ordergroups"."order_id" and "is_recurrent " = 1 个由 "order_group" 组成的组 order by "order_group" asc) 作为 "groups_count" 来自具有 "groups_count" > 1 个 order by "created_at" desc 的 "orders"

如果有人有任何线索:D

【问题讨论】:

【参考方案1】:

withCount 函数向您的模型添加了一个变量,它在查询中不可用(至少据我所知)。

根据您的表结构的少量信息,这应该会给出正确的结果;将whereHas 与相同的查询一起使用,您将确保至少有1 个组与is_recurrent = true,使用withCount 将为您提供单个订单模型的完整计数。

$orders = Order::withCount(['groups' => function ($query) 
    $query->where('is_recurrent', true)->groupBy('order_group');
])
->whereHas(['groups' => function ($query) 
    $query->where('is_recurrent', true)->groupBy('order_group');
])
->get();

【讨论】:

以上是关于具有计数关系的 Laravel 查询构建器的主要内容,如果未能解决你的问题,请参考以下文章

具有依赖项计数的 Laravel 查询构建器

如何使用 Laravel 的流畅查询构建器选择计数?

Laravel 通过属性获得雄辩的查询构建器关系

Laravel 查询构建器与雄辩的关系

Laravel 雄辩与查询构建器的优缺点

Laravel - 查询构建器以选择具有唯一列值的多行(具有另一列的最大值)