Laravel - неверный результат при использовании той же ссылки после вызова метода get - PullRequest
0 голосов
/ 17 апреля 2019
$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 работает нормально, но другие не правы.Пожалуйста, дайте мне знать, почему это не работает, как ожидалось.

Спасибо

Ответы [ 3 ]

2 голосов
/ 17 апреля 2019

Это потому, что 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');


EDIT

На основе вашего обновленного вопроса вы можете сделать:

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

OR

$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. Это даст вам только значение, а не Collection со значением в нем.

0 голосов
/ 17 апреля 2019
$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();

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

0 голосов
/ 17 апреля 2019

попробуйте, например, когда вы получаете $ 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...