комплекс коллекций Laravel и / или выражения

Попытка использовать и / или где операторы, как если бы они были вложены в скобки. пример:

Select * from myTable
where
  (id > 78 or name is not null)
  and term_date >= NOW())

Попытка получить эти сложные инструкции, которые будут использоваться в коллекциях Laravel, примерно так:

$query = myTableModel::where(['id', '>', 78])
    ->orWhereNotNull('name')
    ->where('term_date', '>=', date('Y-m-d'))

Но этот тип запроса будет возвращать где, как это

where
  (id > 78 or
  name is not null and
  term_date >= Now())

или любая другая нечетная комбинация где вместо установки вложенных скобок.

Есть ли способ решить этот тип проблемы с помощью коллекций laravel?

Всего 2 ответа


Чтобы получить запрос, который вы пытаетесь выполнить, вы можете попробовать добавить обратный вызов к методу where и добавить туда, где / илиWhere, вот так:

$query = myTableModel::where(function($query) {
    $query->where('id', '>', 78)
        ->orWhereNotNull('name');
})->where('term_date', '>=', date('Y-m-d'));

Выполнение этого в локальной модели User дает следующее при выполнении toSql (), что, как я полагаю, вам нужно.

select * from `users` where (`id` > ? or `name` is not null) and `term_date` >= ?

Таким образом, концепция решения этой проблемы заключается в использовании замыканий.

Если вы хотите выполнить пример, который я привел, вы бы сделали что-то вроде этого

$query = mytableModel::where(function($q){
    $q->where(['id', '>', 78])
        ->orWhereNotNull('name');
    })->where('term_date', '>=', date('Y-m-d'))
    ->get();

Для более сложного примера, пожалуйста,


Есть идеи?

10000