2015-05-14 3 views
4

Мое приложение динамически создает и запускает сложные запросы для генерации отчетов. В некоторых случаях мне нужно получить несколько, несколько произвольных диапазонов дат, причем все остальные параметры одинаковы.Laravel query builder - повторное использование запроса с поправками, где оператор

Так что мой код строит запрос с кучей объединений, wheres, sorts, limits и т. Д., А затем запускает запрос. То, что я тогда хочу сделать, - это перейти в объект Builder и изменить предложения where, которые определяют диапазон дат для запроса.

До сих пор я сделал это так, чтобы диапазон дат был настроен перед любыми другими объектами, а затем попытался вручную изменить значение в соответствующем атрибуте массива wheres. Как это;

$this->data_qry->wheres[0]['value'] = $new_from_date; 
$this->data_qry->wheres[1]['value'] = $new_to_date; 

Тогда я (будучи уже сделал это однажды уже)

$this->data_qry->get(); 

не работает, хотя. Запрос выполняется только с исходным диапазоном дат. Даже если бы мой способ работал, мне все равно это не понравилось бы, хотя, похоже, оно пробито с неустойчивой зависимостью (какая-то связь?). Т.е.; если дата не устанавливается сначала, тогда все это разваливается.

Любые идеи о том, как достичь этого правильным/опрятным способом, очень приветствуются.

Спасибо,

Geoff

ответ

17

Вы можете использовать clone дублировать запрос, а затем запустить его с различными, где заявления. Во-первых, построить запрос без из-за ограничений, то сделать что-то вроде этого:

$query1 = $this->data_qry; 
$query2 = clone $query1; 

$result1 = $query1->where('from', $from1)->where('to', $to1)->get(); 
$result2 = $query2->where('from', $from2)->where('to', $to2)->get(); 
+0

Это выглядело хорошо, поэтому в конечном итоге, используя что-то вдоль эти линии. Мне пришлось немного изменить поток в моем приложении, но я думаю, что это было к лучшему, в конце концов. Ура! –

1

Предположение из @lukasgeiter с помощью клона определенно путь; причина в том, что объект Eloquent \ Builder содержит внутреннюю ссылку на Query \ Builder, которая должна быть дублирована.

Чтобы сохранить поток вашего приложения и вернуться к более функциональному стилю, вы можете использовать with() помощник Laravel, которая просто возвращает объект, переданный в:

$result1 = with(clone $this->data_qry)->where('from', $from1)->where('to', $to1)->get(); 
$result2 = with(clone $this->data_qry)->where('from', $from2)->where('to', $to2)->get(); 
+0

Или просто заверните оператор clone в круглые скобки: '(clone $ this-> data_qry) -> где ('from', $ from1);' – Aaron

Смежные вопросы