Tho*_*eng 5 php query-builder laravel laravel-5.2 laravel-5.3
最近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构建器中受影响,而不会在Query Builder(以前称为"Fluent Builder")中受到影响.
甚至提交(这是一个很多变化的地狱)只在Eloquent\Builder上. https://github.com/laravel/framework/issues/14829
无论如何,为了安全起见,我建议做相应的调整.这就是我们所做的,虽然我们知道它没有破坏我们的代码(截至今天).
我相信原因是这个拉取请求:https://github.com/laravel/framework/pull/12918
有人想使用这样的范围:
User::approved()->orActive();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果orActive范围定义如下:
public function scopeOrActive($q) {
return $q->orWhere('active',1)
}
Run Code Online (Sandbox Code Playgroud)
和approved范围定义如下:
public function scopeApproved($q) {
return $q->where('approved',1)
}
Run Code Online (Sandbox Code Playgroud)
在laravel 5.2中,它将解决:
where approved = 1 AND active = 1
Run Code Online (Sandbox Code Playgroud)
在Laravel 5.3中,它决定:
where approved = 1 OR active = 1
Run Code Online (Sandbox Code Playgroud)
所以它是有道理的,但我从来没有使用范围开始 orWhere