Как добавить скобки вокруг условий с помощью Laravel query builder

Я использую построитель запросов 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`;

но мне нужно что-то вроде этого (с скобками вокруг операторов or):

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 query builder?

4 ответов


очень полезно, я использую этот:

->where(function ($query) use ($texto){
    $query->where('UPPER(V_CODIGO)', 'LIKE', '%'.Str::upper($texto).'%')
          ->orWhere('UPPER(V_NOMBRE)', 'LIKE', '%'.Str::upper($texto).'%');
});

решил это сам, используя закрытие, как описано в Группировка Параметр в документации построителя запросов.

 $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');

Я не смог найти это в документации, whereNested было то, что я ищу. Надеюсь, это кому-нибудь поможет.

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

Примечание: это на Laravel 4.2


можно использовать WHERE IN здесь для того же эффекта:

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