Как я могу сказать 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');