Где пункт как переменная в Laravel

Я пытаюсь создать более сложный запрос в Laravel 4, который состоит из предложений AND и OR where, в следующем формате:

(('a','=','1') OR ('b','=','s') OR ('c','=','3')) AND (('d','=','1') OR ('e','=','s') OR ('f','=','3'))

Проблема в том, что я генерирую эти запросы на лету, основываясь на некоторых фильтрах, которые пользователь применяет через некоторые формы. Это означает, что запрос может иметь следующий формат:

a AND b

а также этот формат:

(a OR b OR c) AND (d OR e OR f)

а также этот:

(a OR b) AND c AND (d OR e) AND f

Я генерирую предложение where в виде строки, но мне не удается добавить эту переменную в вызов метода.

Пример:

$whereclause = where(function($query){$query->where('colorgrade','like','41-2');})->where(function($query){$query->where('datetime','>','2014-11-05');})

$result = $gin->bales()->$whereclause->take(1000)->get();

Я получаю следующую ошибку:

Неопределенное свойство: Illuminate \ Database \ Eloquent \ Relations \ HasMany :: $ where (function ($ query) {$ query-> где (‘colorgrade’, ‘like’, ’41-2′);}) -> где ( функция ($ запроса) {$ query-> где ( ‘DateTime’, ‘>’, ‘2014-11-05’);})

Как я могу передать сгенерированное предложение where (строковая переменная) вышеупомянутым функциям цепочки?

0

Решение

Для создания запросов на лету хорошей идеей является использование Eloquent Query Scopes.
Это позволяет вам создавать различные запросы, например, на основе параметров формы.

http://laravel.com/docs/4.2/eloquent#query-scopes

1

Другие решения

Вы можете сделать это так, но у меня есть подозрение, что это не работает с замыканиями и цепочечными методами в переменной. Увидеть http://php.net/manual/en/functions.variable-functions.php

$result = $gin->bales()->$whereclause()->take(1000)->get();

Альтернативно, вы можете разделить запрос так, чтобы он не все выполнялся в одной строке.

// Get the initial Query Builder instance
$query = $gin->bales();

$query->where(function($query) {
$query->where('colorgrade', 'like', '41-2');
});

if ($something === 'something') {
$query->where('something', $something);
} else {
$query->where('something', 'something_else');
}

// Finally get our results
$results = $query->take(1000)->get();
0

По вопросам рекламы [email protected]