我正在使用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条件周围添加括号?
答案 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')