我正在尝试在Eloquent中结合使用某些方法,但似乎无法正确地将它们组合在一起。我有一个查询,它提取hasMany计数为0的所有项目。
所以基本上我想知道关系在哪里“空”。在这种情况下,我有一个带音频样本的项目。所以,我想获得没有音频样本的项目。
return $this->hasMany('App\Models\Item')->has('audios', '=', 0);
这完全没问题。但是我还想添加一个基于男性和女性音频样本的过滤器。如果我使用whereHas
我可以直接获取过滤器,但不能在其上获取has 0
子句。
return $this->hasMany('App\Models\Item')->whereHas('audios', function ($q) {
$q->where('gender', 'female');
});
但是我不想把它们结合起来,也无法弄清楚这一点。因此“获取所有没有女性音频样本的项目”。
关于这些的文档并不是很多,除了在琐碎的情况下,我尝试了一些变化,但它没有正确。只是完全空集或只有女性或男性直接没有“空”0集。
以下是我想要的查询:
SELECT *
FROM `items`
WHERE (
SELECT COUNT(*)
FROM `audios`
WHERE `audios`.`item_id` = `items`.`id`
AND `audios`.`gender`='female'
) = 0
答案 0 :(得分:3)
whereHas
,doesntHave
等等都是最终调用has
的方法。如果您查看whereHas
的签名,您可以看到它也允许计数通过:
public function whereHas($relation, Closure $callback, $operator = '>=', $count = 1)
所以你可以这样做,或者只使用whereDoesntHave
:
return $this->hasMany('App\Models\Item')->whereDoesntHave('audios', function ($q) {
$q->where('gender', 'female');
});