laravel 查找具有计数条件的相关项

j2cgzkjk  于 2022-12-05  发布在  其他
关注(0)|答案(2)|浏览(152)

我想为我的模型创建一个名为Ticket的查询作用域。此Ticket有许多回复(模型:并且每个回复可以具有状态(枚举Status)。
现在,我想在Ticket模型上创建一个范围,该范围应过滤状态为UNREAD的回复超过2个的所有票证。
这是我的第一次尝试:

public function scopeEscalatedTickets(Builder $query): Builder
{
    return $query->has('replies', function (Builder $q){
        $q->whereNot('status', Status::READ);
    });
}

但现在我卡住了:我如何创建计数条件,以便考虑到我只希望票证有2个以上的回复,而这些回复没有Status::READ
我的第二个想法是使用

->withCount('replies')->having('replies_count', '>', 2)

也不起作用,通过检查SQL查询,我至少发现withCount实际上只是计算所有相关项,而忽略了其他条件。
感谢您的帮助:-)

qxsslcnc

qxsslcnc1#

若要根据具有指定状态的回覆数目筛选票证,您可以在范围内的产生器执行严修上使用having方法。此方法可让您根据汇总函式的值(例如回覆数目),将条件加入查询。
下面是一个示例,说明如何修改范围以仅返回具有2个以上“未读”状态回复的票据:

public function scopeEscalatedTickets(Builder $query): Builder
{
    return $query->has('replies', function (Builder $q) {
        $q->where('status', Status::UNREAD);
    })->having('replies_count', '>', 2);
}

此范围将首先使用has和where方法筛选票证,以仅包括至少有一个答复状态为“未读”的票证。然后,它将使用having方法仅包括有2个以上答复与条件匹配的票证。
请注意,此范围假设您在票证表中有一个replies_count列,该列保存每个票证的回复数。您可以在生成器示例上使用withCount方法生成此列,如下所示:

$tickets = Ticket::withCount('replies')->get();

这将向$tickets集合中的每个票证附加一个replies_count属性,您可以在范围中使用该属性根据回复数筛选票证。
我希望这对你有帮助!如果你有任何其他问题,请告诉我。

9rygscc1

9rygscc12#

你可以使用whereHas()它将检查模型是否与一个条件具有给定的关系:

$query->whereHas('replies', function() {
    $query->where('status', Status::UNREAD);
}, '>', 2);

现在,它将查询具有2个以上replies且具有Status::UNREAD所有票据

相关问题