我使用一个查询范围,该范围应附加一个orWhere条件,但它附加一个法线where(with AND)。如果我删除查询范围并直接放置它确实返回OR条件。
查询如下所示:
$query = MyModel::firstQueryScope()->secondQueryScope();
FirstQueryScope:
public function scopeFirstQueryScope($query){
return $query->where('someAttribute', 0);
}
第二个查询范围:
public function scopeSecondQueryScope($query){
return $query->orWhere('someOtherAttribute', 0);
}
以这种方式构建查询应该与:
相同$query = MyModel::where('someAttribute', 0)->orWhere('someOtherAttribute', 0);
但第一种方法会返回此查询:
select * from MyModelTable where someAttribute = 0 AND (someOtherAttribute = 0)
。第二种方法返回:
select * from MyModelTable where someAttribute = 0 OR someOtherAttribute = 0
我已经注意到两件事:
我做错了什么?或者这可能是一个Eloquent的错误吗?
注意:我正在构建的查询更加详细,但我已经将其简化为简单,以验证我没有做任何奇怪的事情。
我尝试调试Eloquent的构建过程,发现它正在添加嵌套的,并在其中添加或Where 范围。同样,这只会在将或者放入范围内时发生,但在添加简单的其中时不会发生。 嵌套位置负责在parenthisis中包围或Where 表达式。
答案 0 :(得分:0)
我认为范围本身是孤立的。
只需添加第三个范围即可。
public function scopeFirstQueryOrSecondQuery($query){
return $query->where('someAttribute', 0)
->orWhere('someOtherAttribute', 0);
}
-
MyModel::firstQueryOrSecondQuery()->get();