2017-09-26 68 views
0

我有一個基於某些參數提取用戶的查詢。Laravel where子句無法在系列或其他地方工作

$users = User::where(function($query) use($queryTags_userIDs) { 
    $query->whereIn('id', $queryTags_userIDs); 
})->orWhere(function($query) use($queryImageTitles_userIDs) { 
    $query->whereIn('id', $queryImageTitles_userIDs); 
})->orWhere('username', 'LIKE', "%{$query}%") 
    ->orWhere('keywords', 'LIKE', "%{$query}%")  
    ->orWhere('profile_text', 'LIKE', "%{$query}%") 
    ->orWhere('tagline', 'LIKE', "%{$query}%") 
    ->where('role', 2) 
    ->orderBy('last_login', 'desc') 
    ->paginate(15); 

現在,這整個事情很好。

除本部分:

->where('role', 2) 

而是讓用戶在那裏角色是2,它提取的每一個角色的用戶。

但是,它會工作,如果我擺脫了一些orWheres。

如果我擺脫這些3個orWheres的:

->orWhere('keywords', 'LIKE', "%{$query}%")  
->orWhere('profile_text', 'LIKE', "%{$query}%") 
->orWhere('tagline', 'LIKE', "%{$query}%") 

然後開始取用戶只用角色2.事實上,這3個特定orWheres是,不管是什麼原因,導致該問題

如果我減少查詢只

$users = User::where('username', 'LIKE', "%{$query}%") 
    ->orWhere('keywords', 'LIKE', "%{$query}%")  
    ->where('role', 2) 
    ->orderBy('last_login', 'desc') 
    ->paginate(7); 

它仍然得到用戶的角色之外2.

但是,如果它是將其切換到這一點:

$users = User::where('username', 'LIKE', "%{$query}%") 
    ->where('role', 2) 
    ->orderBy('last_login', 'desc') 
    ->paginate(7); 

然後突然它只是會從角色2.

用戶爲什麼會出現這種情況?我覺得我錯過了一些超級明顯的東西,因爲這沒有意義。

編輯

爲了應對厄爾尼諾的Bassem哈希姆,我把角色= 2在查詢的開始。但它仍然不起作用。這裏是變更後的查詢:

「從users選擇*其中role =和(在id(,,,,, )???????)或(id在(? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?))或(username LIKE?或keywords ???LIKE或 profile_text LIKE或tagline等),以便通過last_login desc」的

+0

試試我的新答案。另一個'WHERE'全部是'OR's還是有另一個強制性的WHERE? –

+0

新答案有效。 –

回答

1

那是因爲你的SQL查詢是這樣的:

WHERE keywords like '%...%' OR profile_text LIKE '%...%' 
OR tagline LIKE '%...%' AND role=2 

AND運營商在SQL就像乘法,它增加了一個括號,這意味着你的查詢是真的:

WHERE keywords like '%...%' OR profile_text LIKE '%...%' 
OR (tagline LIKE '%...%' AND role=2) 

所以過濾器role=2被應用特定行僅(那些其中tagline LIKE '%...%')。對於行數keywords like '%...%' OR profile_text LIKE '%...%',角色可以是任何值,這不是你想要的。

你需要做的是直接在user上應用role上的篩選。毫無疑問,這也有助於提高效率。

$users = User::where('role', 2) 
    ->where(function($q) use($queryTags_userIDs,$queryImageTitles_userIDs,$query) { 
     $q->whereIn('id', $queryTags_userIDs) 
     ->orWhereIn('id', $queryImageTitles_userIDs) 
     ->orWhere('username', 'LIKE', "%{$query}%") 
     ->orWhere('keywords', 'LIKE', "%{$query}%")  
     ->orWhere('profile_text', 'LIKE', "%{$query}%") 
     ->orWhere('tagline', 'LIKE', "%{$query}%"); 
    })->orderBy('last_login', 'desc') 
    ->paginate(15); 

既然不清楚你想要什麼結果,我會建議以SQL語法查看查詢。這可以通過將paginate(15)替換爲toSql()dd()的結果來完成。

+0

不起作用。我用toSql()wasump編輯了我的回覆。 –