Объединение запроса AND/OR в Laravel

Как я могу написать следующие или похожие запросы с помощью Eloquent?

SELECT * FROM a_table WHERE (a LIKE %keyword% OR b LIKE %keyword%) AND c = 1 AND d = 5

Я не мог объединить AND/OR так, как я хотел, привязывая функции where и or_where.

Ответы

Ответ 1

Вы можете заключить, где клаузулы: http://laravel.com/docs/database/fluent#nested-where

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

Это должно произвести: SELECT * FROM models WHERE (a LIKE %keyword% OR b LIKE %keyword%) AND c = 1

Ответ 2

Для более точного ответа на пример:

$val = '%keyword%';

A_Table_Model::where(function($query) use ($val)
{
    $query->where('a', 'like', $val);
    $query->or_where('b', 'like', $val);
})
->where('c', '=', 1)
->where('d', '=', 5)
->get();

Примечание. Это синтаксис Laravel 3, используйте camelCase или Where() для Laravel 4

Ответ 3

В Laravel 5.1+ это также сделает работу и выглядит более чистым:

Model::where(function($query) {
    $query->where('a', 'like', 'keyword');
    $query->or_where('b', 'like', 'keyword');
})->where('c', '=', '1')->get();

Ответ 4

Вы можете использовать DB::raw() в первом where(), чтобы поместить в инструкцию like/.