Это потому, что 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
со значением в нем.