最近Laravel发布了5.3版本。
以下链接中有5.2到5.3的升级说明: https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0
Eloquent范围现在尊重范围约束的主要布尔值。例如,如果您使用orWhere约束启动范围,则将不再将其转换为normal。如果您依赖于此功能(例如,在循环中添加多个或者约束),则应验证第一个条件是否正常,以避免任何布尔逻辑问题。
如果您的范围从约束开始,则不需要采取任何操作。请记住,您可以使用查询的toSql方法验证查询SQL:
这似乎使事情变得更加困难,升级只会增加限制。
我们有一个内部包,为了保持代码简单和尽可能整齐,有一部分依赖于使用orWhere()启动查询,并在递归方法中使用它以及闭包概念。如您所知,递归方法最好保持简洁。
根据现在的升级说明,它肯定会在Laravel 5.3上失败
我只是想知道是否有人知道为什么要删除此行为的原因?
谢谢!
更新
我已将我们的系统迁移到Laravel 5.3。我确认这只会在Eloquent构建器中受到影响,而不会在查询构建器(以前的#34; Fluent Builder")中受到影响。
即使是提交(这是一个很难改变的地狱)也只在Eloquent \ Builder上。 https://github.com/laravel/framework/issues/14829
无论如何,为了安全起见,我建议做相应的调整。这就是我们所做的,虽然我们知道它没有破坏我们的代码(截至今天)。
答案 0 :(得分:6)
我相信这个拉取请求的确切原因是:https://github.com/laravel/framework/pull/12918
有人想使用这样的范围:
User::approved()->orActive();
并且在这种情况下,如果orActive
范围定义如下:
public function scopeOrActive($q) {
return $q->orWhere('active',1)
}
和approved
范围的定义如下:
public function scopeApproved($q) {
return $q->where('approved',1)
}
在laravel 5.2中,它将解决:
where approved = 1 AND active = 1
并且在Laravel 5.3中,它决定:
where approved = 1 OR active = 1
所以它有意义但是我从未使用以orWhere
答案 1 :(得分:0)
这是一种将多个orWhere子句与布尔值一起使用的方法。假设您想要查询:
从active = 1且(user_type = 1或user_type = 2或user_type = 3)的用户中选择*;
但是我们并不总是希望所有的user_types都在查询中,即我们有一些布尔值来决定哪些应该存在。这可以这样实现:
$includeOne = true;
$includeTwo = false;
$includeThree = true;
$query = User::where('active', 1)
->where(function($q) use ($includeOne, $includeTwo, $includeThree) {
$q->when($includeOne, function($query) {
return $query->orWhere('user_type', 1);
})
->when($includeTwo, function($query) {
return $query->orWhere('user_type', 2);
})
->when($includeThree, function($query) {
return $query->orWhere('user_type', 3);
});
})->get();