Laravel-在调用get方法后使用相同引用时结果错误

时间:2019-04-17 07:35:10

标签: laravel eloquent

$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 个答案:

答案 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();

尝试这一口才。