Laravel 组合 has() 和 whereHas()

Laravel combining has() and whereHas()

我正在尝试组合 Eloquent 中的一些方法,但似乎无法正确组合。我有一个查询可以提取 hasMany 计数为 0 的所有项目。

所以基本上我想知道关系在哪里"empty"。在这种情况下,我有一个带有音频样本的项目。所以,我想获取还没有音频样本的项目。

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');
});

但是不,我想把它们结合起来,但我想不通。所以 "get all items with no female audio samples".

除了微不足道的情况外,关于这些的文档不多,我尝试了一些变体,但效果不佳。只是完全空集或只有女性或男性直接没有 "empty" 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');
});