Laravel 4 красноречивый ГДЕ с ИЛИ ИЛИ ИЛИ?

Как я могу сказать WHERE (a=1 OR b=1) AND (c=1 OR d=1)

Для более сложных запросов я должен использовать raw SQL?

Используйте Группировку параметров ( Laravel 4.2 ). Для вашего примера это будет примерно так:

 Model::where(function ($query) { $query->where('a', '=', 1) ->orWhere('b', '=', 1); })->where(function ($query) { $query->where('c', '=', 1) ->orWhere('d', '=', 1); }); 

Если вы хотите использовать параметры для a, b, c, d в Laravel 4

 Model::where(function ($query) use ($a,$b) { $query->where('a', '=', $a) ->orWhere('b', '=', $b); }) ->where(function ($query) use ($c,$d) { $query->where('c', '=', $c) ->orWhere('d', '=', $d); }); 

Если вы зацикливаете условия OR, вам не нужен второй $ query->, где из других сообщений (на самом деле я не думаю, что вам нужно вообще, вы можете просто использовать orWhere в вложенном месте, если это проще)

 $attributes = ['first'=>'a','second'=>'b']; $query->where(function ($query) use ($attributes) { foreach ($attributes as $key=>value) { //you can use orWhere the first time, dosn't need to be ->where $query->orWhere($key,$value); } }); 

если вы хотите использовать круглые скобки в laravel 4 и не забудьте вернуться
В Laravel 4 (по крайней мере) вам нужно использовать $ a, $ b в круглых скобках, как в примере

 $a = 1; $b = 1; $c = 1; $d = 1; Model::where(function ($query) use ($a, $b) { return $query->where('a', '=', $a) ->orWhere('b', '=', $b); })->where(function ($query) use ($c, $d) { return $query->where('c', '=', $c) ->orWhere('d', '=', $d); }); 

Это мой результат: введите описание изображения здесь

Вы также можете запросить первое или условие, а позже вы можете применить другое или условие

 $model = Model::where('a',1)->orWhere('b',1); 

теперь применим другое условие для этой переменной $model

 $model1 = $model->where('c',1)->orWhere('d',1)->get(); 

Вы также можете использовать области запросов, чтобы сделать вещи немного более аккуратными, поэтому вы можете сделать что-то вроде:

 Invoice::where('account', 27)->notPaidAt($date)->get(); 

Тогда в вашей модели

 public function scopeNotPaidAt($query, $asAt) { $query = $query->where(function ($query) use ($asAt) { $query->where('paid', '=', '0000-00-00')->orWhere('paid', '>=', $asAt); }); return $query; } 

$ a, $ b, $ c, $ d могут быть динамическими значениями по запросу

  ->where(function($query) use ($a, $b) { $query->where('a', $a) ->orWhere('b',$b); }) ->where(function($query) use ($c, $d) { $query->where('c', $c) ->orWhere('d',$d); }) 

Просто используйте в Laravel Rloquent:

 $a='foo', $b='bar', $c='john', $d='doe'; Coder::where(function ($query) use ($a, $b) { $query->where('a', '=', $a) ->orWhere('b', '=', $b); })->where(function ($query) use ($c, $d) { $query->where('c', '=', $c) ->orWhere('d', '=', $d); })->get(); 

Выведет запрос типа:

 SELECT * FROM <table> WHERE (a='foo' or b='bar') AND (c='john' or d='doe');