Laravel query builder-повторное использование запроса с измененной инструкцией where

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

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

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

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

тогда я делаю (уже сделал это один раз)

$this->data_qry->get();

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

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

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

спасибо,

Джефф

2 ответов


можно использовать clone чтобы дублировать запрос, а затем запустить его с различными инструкциями where. Сначала создайте запрос без ограничений from-to, затем сделайте что-то вроде этого:

$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();

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

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

$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();