繁体   English   中英

Laravel where子句在一系列orwhere之后不起作用

[英]Laravel where clause not working after series of orwhere

我有一个查询,根据一些参数获取用户。

$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的用户,而是获取每个角色的用户。

但是,如果我摆脱一些或者某些东西,它会起作用。

如果我摆脱这些3或者范围:

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

然后它开始仅使用角色2获取用户。事实上,无论出于何种原因,这3个特定或者范围都会导致问题

如果我只将查询减少到

$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 El Hachem,我在查询的开头放了role = 2。 但它仍然无效。 这是更改后的查询:

“select * from users where role =?and( id in(?,?,?,?,?,?,?))或( id in(?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?))或( username LIKE?或keywords LIKE?或profile_text LIKE?或tagline LIKE?)order by last_login desc“

那是因为你在SQL中的查询是这样的:

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

SQL中的AND运算符就像乘法,它添加了一个括号,这意味着您的查询确实是:

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

因此,filter role=2仅应用于特定行tagline LIKE '%...%'的那些 )。 对于keywords like '%...%' OR profile_text LIKE '%...%'行,角色可以是任何值,这不是您想要的。

您需要做的是直接在user上应用role过滤WHERE。 这无疑也有助于提高效率。

$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语法查看查询。 这可以通过用toSql()dd()替换paginate(15)来完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM