繁体   English   中英

Laravel组合有()和whereHas()

[英]Laravel combining has() and whereHas()

我试图在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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM