$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
可以正常工作,但其他错误。请让我知道为什么它不能按预期工作。
谢谢
答案 0 :(得分:2)
这是因为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)
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)'))
并使用Laravel的sum()
方法。这将只为您提供值,而不是其中包含值的Collection
。
答案 1 :(得分:0)
尝试此操作,因为当您为resultB获取$ querybody时,它变成了$ 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();
答案 2 :(得分:0)
$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();
尝试这一口才。