Laravel 5.3 - 以orWhere开头的查询生成器

时间:2016-07-13 16:59:40

标签: php laravel laravel-5.2 query-builder 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构建器中受到影响,而不会在查询构建器(以前的#34; Fluent Builder")中受到影响。

即使是提交(这是一个很难改变的地狱)也只在Eloquent \ Builder上。 https://github.com/laravel/framework/issues/14829

无论如何,为了安全起见,我建议做相应的调整。这就是我们所做的,虽然我们知道它没有破坏我们的代码(截至今天)。

2 个答案:

答案 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();