2014-02-21 98 views
4

我有三個表userrolepermissionuser的hasMany rolerole的hasMany permission,我想找出用戶誰擁有我給了允許,所以我用whereHas如何使用orWhere在whereHas在Laravel

$user = User::whereHas('roles', function($q) { 
    $q->whereHas('permissions', $function($q) { 
     $q->where('name', $value); 
    }); 
}); 

結果是正確的,但如果我想通過更多條件搜索用戶,我給其他許可值並使用orWhere,它會響應所有有權限的用戶,如何修復它?

$user = User::whereHas('roles', function($q) { 
    $q->whereHas('permissions', $function($q) { 
     $q->where('name', $value)->orWhere('name', $value2); 
    }); 
}); 

回答

1

使用第一$ Q變量,其中應該工作

User::has('roles')->whereHas('permissions', $function($q) { 
     $q->where('name', $value)->orWhere('name', $value2); 
    }); 
+0

用戶與權限沒有關係,這是行不通的。 – Chan

+0

我打算在第一個「where」子句中說「角色」而不是「權限」。我已經更新了答案,這應該起作用。 – marcanuy

+0

我知道,我試過了,它顯示調用未定義的方法Illuminate \ Database \ Query \ Builder :: permissions() – Chan

1

我遇到了同樣的問題,避免:我想實現對企業進行表格檢索。搜索字符串應在公司名稱以及關聯的聯繫人姓名和姓氏中進行搜索。我的嘗試是這樣的:

Company::where('name', 'like', '%'.$searchstring.'%') 
     ->orWhereHas('contacts', function($q) use ($searchstring) { 
            $q->where('forename', 'like', '%'.$searchstring.'%') 
            ->orWhere('lastname', 'like', '%'.$searchstring.'%'); 
            }); 

結果與您所描述的結果類似:對於某些搜索字符串,所有公司都返回了。

只能解決的解決方法是將orWhereHas-closure的where和orWhere分隔爲兩個或兩個關閉。就像這樣:

Company::with('mainContact', 'contacts') 
     ->where('name', 'like', '%'.$searchstring.'%') 
     ->orWhereHas('contacts', function($q) use ($searchstring) { 
            $q->where('forename', 'like', '%'.$searchstring.'%'); 
            }) 
     ->orWhereHas('contacts', function($q) use ($searchstring) { 
            $q->where('lastname', 'like', '%'.$searchstring.'%'); 
            }); 

我不知道,如果這產生一個非常昂貴的SQL查詢,但它的作品。我的代碼片段的任何改進都非常受歡迎。