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