我有一个基于某些参数获取用户的查询。
$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 El Hachem,我将 role = 2 放在查询的开头。但它仍然不起作用。这是更改后的查询:
"select * from
userswhererole= ? and (idin (?, ?, ?, ?, ?, ?, ?)) or (idin (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)) or (usernameLIKE ? orkeywordsLIKE ? orprofile_textLIKE ? ortaglineLIKE ?) order bylast_logindesc"
最佳答案
那是因为你在 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)
因此过滤器 role=2 被应用于仅特定行(tagline LIKE '%...%' ).对于 keywords like '%...%' OR profile_text LIKE '%...%' 的行,role 可以是任何值,这不是您想要的。
您需要做的是直接在 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 语法查看查询。这可以通过将 paginate(15) 替换为 toSql() 和 dd() 结果来完成。
关于php - Laravel where 子句在一系列 orwhere 之后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46437453/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于
我目前正在尝试学习RubyonRails和测试框架RSpec。assigns在此RSpec测试中做什么?describe"GETindex"doit"assignsallmymodelas@mymodel"domymodel=Factory(:mymodel)get:indexassigns(:mymodels).shouldeq([mymodel])endend 最佳答案 assigns只是检查您在Controller中设置的实例变量的值。这里检查@mymodels。 关于ruby-o
我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params
这段代码没有像我预期的那样执行:casewhen->{false}then"why?"else"ThisiswhatIexpect"end#=>"why?"这也不是casewhen->(x){false}then"why?"else"ThisiswhatIexpect"end#=>"why?"第一个then子句在两种情况下都被执行,这意味着我提供给when子句的lambda没有被调用。我知道无论when子句的主题是什么,都应该调用大小写相等运算符===。我想知道当没有为case提供参数时,===的另一边会发生什么。我在想它可能是nil,但它不可能是:->{false}===nil#=>
这段代码似乎创建了一个范围从a到z的数组,但我不明白*的作用。有人可以解释一下吗?[*"a".."z"] 最佳答案 它叫做splatoperator.SplattinganLvalueAmaximumofonelvaluemaybesplattedinwhichcaseitisassignedanArrayconsistingoftheremainingrvaluesthatlackcorrespondinglvalues.Iftherightmostlvalueissplattedthenitconsumesallrvaluesw
你能解释一下吗?我想评估来自两个不同来源的值和计算。一个消息来源为我提供了以下信息(以编程方式):'a=2'第二个来源给了我这个表达式来评估:'a+3'这个有效:a=2eval'a+3'这也有效:eval'a=2;a+3'但我真正需要的是这个,但它不起作用:eval'a=2'eval'a+3'我想了解其中的区别,以及如何使最后一个选项起作用。感谢您的帮助。 最佳答案 您可以创建一个Binding,并将相同的绑定(bind)与每个eval相关联调用:1.9.3p194:008>b=binding=>#1.9.3p194:009>eva