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