[英]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.