如何使用Laravel查询构建器在WHERE条件周围添加括号

时间:2014-03-27 17:24:43

标签: mysql laravel

我正在使用Laravel查询构建器根据用户的过滤器选择动态过滤数据:

 $query = DB::table('readings');
 foreach ($selections as $selection) {
   $query->orWhere('id', $selection);
 }
 $query->whereBetween('date', array($from, $to));
 $query->groupBy('id');

当我检查SQL时,我会得到这样的结果:

select count(*) as `count` from `readings` where `id` = 1 or id` = 2 and `date` between "2013-09-01" and "2013-09-31" group by `id`;

但我需要的是这样的东西(括号或语句旁边):

select count(*) as `count` from `readings` where (`id` = 1 or id` = 2) and `date` between "2013-09-01" and "2013-09-31" group by `id`;

如何使用Laravel查询构建器在WHERE条件周围添加括号?

4 个答案:

答案 0 :(得分:6)

使用闭包解决了这个问题,如查询构建器文档中的 Parameter Grouping 所述。

 $query = DB::table('readings');
 $this->builder->orWhere(function($query) use ($selections)
 {
    foreach ($selections as $selection) {
       $query->orWhere('id', $selection);
    }
 });
 $query->whereBetween('date', array($from, $to));
 $query->groupBy('id');

答案 1 :(得分:6)

我在文档中找不到这个,whereNested正是我想要的。希望它可以帮助任何人。

$q->whereNested(function($q) use ($nameSearch) {
    $q->where('name', 'LIKE', "%{$nameSearch}%");
    $q->orWhere('surname', 'LIKE', "%{$nameSearch}%");
});

注意:这是在Laravel 4.2

答案 2 :(得分:2)

您可以在此使用WHERE IN获得相同的效果:

$query = DB::table('readings');
$query->whereIn('id', $selection)
$query->whereBetween('date', array($from, $to));
$query->groupBy('id');

答案 3 :(得分:1)

有时您可能需要在括号内对几个“where”子句进行分组,以实现查询所需的逻辑分组。实际上,您通常应该始终将 orWhere 方法的调用分组在括号中,以避免出现意外的查询行为。为此,您可以向 where 方法传递一个闭包:

$users = DB::table('users')
           ->where('name', '=', 'John')
           ->where(function ($query) {
               $query->where('votes', '>', 100)
                     ->orWhere('title', '=', 'Admin');
           })
           ->get();

如您所见,将闭包传递给 where 方法指示查询构建器开始约束组。闭包将接收一个查询构建器实例,您可以使用它来设置应包含在括号组中的约束。上面的示例将生成以下 SQL:

select * from users where name = 'John' and (votes > 100 or title = 'Admin')