[英]Complex eloquent nested relationship queries with Laravel
所以我在我的 laravel 应用程序中建立了一个雄辩的查询。 该查询有许多不同的关系被引入其中,并设置如下:
CourseEnrollment::whereIn('domain_id', $domain_ids)
->whereHas('member', function($query)use ($filterUser){
if($filterUser === 'true'){
$query->where('email', 'NOT LIKE', '%@gmail.com%');
$query->where('email', 'NOT LIKE', '%@yahoo.com%');
$query->where('email', 'NOT LIKE', '%@boss.com%');
$query->where('email', 'NOT LIKE', '%@test.com%');
}
$query->where('is_mentor', 1)->orWhere(function ($q){
$q->where('privileges', '!=', 0);
});
})
->get();
如果您查看代码 $query->where(is_mentor, 1)->orWhere... 的行,您可以看到我尝试创建一个使用嵌套在两个不同点的键的 orWhere 情况。 权限实际上不是在成员关系上,而是在我正在查询的主 CourseEnrollment 表上的一个键。 我需要能够说如果enrollment.privileges 不等于0 或者如果member.is_mentor 键等于1 然后获取该注册,否则不要获取该注册。 正如我现在拥有的那样,我认为它正在工作,但我遇到的问题是,当我将它与上面过滤掉电子邮件的逻辑结合起来时,orWhere 会覆盖该逻辑。 例如,我正在过滤掉所有的电子邮件,这条路线本应该什么都不返回,但是能够通过满足 orWhere 语句的两个条件的注册。 有没有更好的方法来比较 laravel 中不同的嵌套键?
我建议在使用 orWhere 之前将查询与 where 分组,以防止不过滤以前的 where,就像添加括号括住内部条件一样。
CourseEnrollment::whereIn('domain_id', $domain_ids)
->whereHas('member', function ($query) use ($filterUser) {
if ($filterUser === 'true') {
$query->where('email', 'NOT LIKE', '%@gmail.com%');
$query->where('email', 'NOT LIKE', '%@yahoo.com%');
$query->where('email', 'NOT LIKE', '%@boss.com%');
$query->where('email', 'NOT LIKE', '%@test.com%');
}
$query
->where(function ($sub) {
$sub->where('is_mentor', 1);
$sub->orWhere('privileges', '!=', 0);
});
})
->get();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.