Laravel 5.2查询范围与orWhere的意外行为

时间:2017-01-15 18:26:57

标签: eloquent laravel-5.2

我使用一个查询范围,该范围应附加一个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

我已经注意到两件事:

  1. 无论您调用FirstQueryScope或SecondQueryScope的顺序如何,它总是用括号括起或者范围。
  2. 或者方法仅在从查询范围调用时广告括号。
  3. 我做错了什么?或者这可能是一个Eloquent的错误吗?

    注意:我正在构建的查询更加详细,但我已经将其简化为简单,以验证我没有做任何奇怪的事情。

    更新

    我尝试调试Eloquent的构建过程,发现它正在添加嵌套的,并在其中添加或Where 范围。同样,这只会在将或者放入范围内时发生,但在添加简单的其中时不会发生。 嵌套位置负责在parenthisis中包围或Where 表达式。

1 个答案:

答案 0 :(得分:0)

我认为范围本身是孤立的。

只需添加第三个范围即可。

public function scopeFirstQueryOrSecondQuery($query){
    return $query->where('someAttribute', 0)
        ->orWhere('someOtherAttribute', 0);
}

-

MyModel::firstQueryOrSecondQuery()->get();