我正在尝试在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');
});

但是,不,我想将它们结合起来,无法解决。因此,“获得没有女性音频样本的所有项目”。

除了琐碎的案异常(exception),关于这些文档的文档不多,我尝试了一些变体,但效果不佳。只是完全空集,或者只有女性或男性,而没有“空” 0集。

这是我想获取的查询:
SELECT *
FROM `items`
WHERE (
    SELECT COUNT(*)
    FROM `audios`
    WHERE `audios`.`item_id` = `items`.`id`
    AND `audios`.`gender`='female'
) = 0

最佳答案

whereHasdoesntHave等都是最后调用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');
});

10-07 22:00