Laravel — неправильный результат при использовании той же ссылки после вызова метода get

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

Попробуйте этот как красноречивый.