#laravel #eloquent
#laravel #красноречивый
Вопрос:
$queryBody = DB::table("tableA")->where("columnA", true)->where('columnC', true)->select(DB::raw('SUM(columnD)'));
$resultA = $queryBody->where('columnB', 'A')->get();
$resultB = $queryBody->where('columnB', 'B')->get();
$resultC = $queryBody->where('columnB', 'C')->get();
Вот как я написал код, и я ожидаю, что результат будет отличаться друг от друга. Тем не менее, $resultA
работает нормально, но другие ошибаются. Пожалуйста, дайте мне знать, почему это работает не так, как ожидалось.
Спасибо
Ответ №1:
Это связано Builder
с тем, что он будет использоваться по ссылке, а не дублироваться, поэтому каждый запрос будет иметь ограничения из последнего.
Проще всего обойти это, используя clone
:
$queryBody = DB::table("tableA")->select(DB::raw('SUM(columnA)'));
$resultA = (clone $queryBody)->where('columnB', 'A')->get();
$resultB = (clone $queryBody)->where('columnB', 'B')->get();
$resultC = (clone $queryBody)->where('columnB', 'C')->get();
Кроме того, я предполагаю, что запросы в вашем вопросе — это всего лишь примеры, но Laravel поставляется с методом sum() для построителя запросов, чтобы вы могли сделать:
$queryBody = DB::table("tableA");
$resultA = (clone $queryBody)->where('columnB', 'A')->sum('columnA');
$resultB = (clone $queryBody)->where('columnB', 'B')->sum('columnA');
$resultC = (clone $queryBody)->where('columnB', 'C')->sum('columnA');
Я все еще использовал $queryBody
в приведенном выше примере, но если бы это был ваш фактический запрос, я бы просто встроил DB::table("tableA")
и $queryBody
полностью удалил, т.е.
$resultA = DB::table("tableA")->where('columnB', 'A')->sum('columnA');
Редактировать
Основываясь на вашем обновленном вопросе, вы можете либо сделать:
$queryBody = DB::table("tableA")->where("columnA", true)->where('columnC', true)->select(DB::raw('SUM(columnD)'));
$resultA = (clone $queryBody)->where('columnB', 'A')->get();
$resultB = (clone $queryBody)->where('columnB', 'B')->get();
$resultC = (clone $queryBody)->where('columnB', 'C')->get();
Изменение (clone $queryBody)
или
$queryBody = DB::table("tableA")->where("columnA", true)->where('columnC', true);
$resultA = (clone $queryBody)->where('columnB', 'A')->sum('columnD');
$resultB = (clone $queryBody)->where('columnB', 'B')->sum('columnD');
$resultC = (clone $queryBody)->where('columnB', 'C')->sum('columnD');
Это просто удаление ->select(DB::raw('SUM(columnD)'))
из базового запроса и использование sum()
метода Laravel. Это даст вам только значение, а не a Collection
со значением в нем.
Комментарии:
1. Спасибо за быстрый комментарий. Я только что обновил свой вопрос. существует много
where
замыканий. Итак, если я использую встроенный стиль, как вы написали, тогда мне нужно снова написать дублированные условия?2. @AlexandrBiship В этом случае вы можете использовать любой пример. По сути, вы просто удаляете
->select(DB::raw('SUM(columnD)'))
из$queryBody
и меняетеget()
на->sum('columnD')
.3. @AlexandrBiship Я обновлю свой ответ, чтобы показать вам, что я имею в виду. Просто к твоему сведению, тебе не нужно использовать
sum()
, если ты этого не хочешь. Я просто хотел сообщить вам, что есть альтернатива, но используйте ее только в том случае, если это имеет смысл.4. Спасибо. на самом деле запрос, который мне нужно использовать, очень сложный. поэтому мне нужно удалить дублирующиеся условия, насколько это возможно. Мне нравится clone, и для меня это имеет смысл. но не уверен, что это лучший способ.
5. @AlexandrBiship В зависимости от того, какой из них работает и имеет смысл для вас. Основной смысл моего ответа на удаление — это использование
clone
. Если это поможет, пока просто игнорируйтеsum()
бит. Я только добавил, что, к вашему сведению, это никоим образом не то, что вам нужно делать. В будущих сообщениях я бы определенно рекомендовал использовать ваш фактический код в качестве примера для вашего вопроса, а не упрощенную версию, поскольку в некоторых случаях это может привести к некоторой путанице.
Ответ №2:
попробуйте это, как при извлечении $querybody для resultB он стал $ResultA-
$resultA = DB::table("tableA")->select(DB::raw('SUM(columnA)'))->where('columnB', 'A')->get();
$resultB = DB::table("tableA")->select(DB::raw('SUM(columnA)'))->where('columnB', 'B')->get();
$resultC = DB::table("tableA")->select(DB::raw('SUM(columnA)'))->where('columnB', 'C')->get();
Ответ №3:
$resultA = TableA::select(DB::raw('SUM(columnA)'))->where('columnB', 'A')->get();
$resultB = TableA::select(DB::raw('SUM(columnA)'))->where('columnB', 'B')->get();
$resultC = TableA::select(DB::raw('SUM(columnA)'))->where('columnB', 'C')->get();
Попробуйте этот как красноречивый.