我想为我的模型创建一个名为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
实际上只是计算所有相关项,而忽略了其他条件。
感谢您的帮助:-)
2条答案
按热度按时间qxsslcnc1#
若要根据具有指定状态的回覆数目筛选票证,您可以在范围内的产生器执行严修上使用having方法。此方法可让您根据汇总函式的值(例如回覆数目),将条件加入查询。
下面是一个示例,说明如何修改范围以仅返回具有2个以上“未读”状态回复的票据:
此范围将首先使用has和where方法筛选票证,以仅包括至少有一个答复状态为“未读”的票证。然后,它将使用having方法仅包括有2个以上答复与条件匹配的票证。
请注意,此范围假设您在票证表中有一个replies_count列,该列保存每个票证的回复数。您可以在生成器示例上使用withCount方法生成此列,如下所示:
这将向$tickets集合中的每个票证附加一个replies_count属性,您可以在范围中使用该属性根据回复数筛选票证。
我希望这对你有帮助!如果你有任何其他问题,请告诉我。
9rygscc12#
你可以使用
whereHas()
它将检查模型是否与一个条件具有给定的关系:现在,它将查询具有2个以上
replies
且具有Status::UNREAD
所有票据