![](/img/trans.png)
[英]Laravel where clause is not working after multiple orWhere clauses?
[英]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
whererole
=?and(id
in(?,?,?,?,?,?,?))或(id
in(?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?))或(username
LIKE?或keywords
LIKE?或profile_text
LIKE?或tagline
LIKE?)order bylast_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.