2017-09-26 95 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编辑了我的回复。 –