Я пытаюсь создать более сложный запрос в 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 (строковая переменная) вышеупомянутым функциям цепочки?
Для создания запросов на лету хорошей идеей является использование Eloquent Query Scopes.
Это позволяет вам создавать различные запросы, например, на основе параметров формы.
Вы можете сделать это так, но у меня есть подозрение, что это не работает с замыканиями и цепочечными методами в переменной. Увидеть 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();