通过在 Table1.id 上应用 groupBy 但在 Table2 上没有软删除行,使用 Laravel Query Builder 计算总和?

Calculate sum using Laravel Query Builder by applying groupBy on Table1.id but without soft deleted rows on Table2?

我想获取所有购买及其金额,如果 payments.deleted_at 不为空,我也不想添加金额。

这是表格

购买

id | name
1  | Gamerzone Book
2  | Recipe Book
3  | EngineX Book

付款

id  | purchase_id  | amount  | deleted_at
1     1              100       2015-06-12 11:00:00
2     2              50        NULL
2     2              10        NULL

代码

$query = DB::table('purchases')
        ->select(['purchases.*',
                   DB::raw("IFNULL(sum(payments.amount),0) as total")
            ])
         ->leftJoin('payments','payments.purchase_id','=','purchases.id')
         ->whereNull('payments.deleted_at')
         ->groupBy('purchases.id')->get();

当我运行第一个结果下面的代码不包括在内。 结果

id | name               | total
2  | Recipe Book          60 
3  | EngineX Book         0

我知道为什么它不包括在内,但问题是如果我删除 whereNull('payments.deleted_at') 付款中的特定行 还将添加到 sum.How 我应该解决这个问题吗??

预期结果

id | name               | total
1  | Gamerzone Book       0
2  | Recipe Book          60 
3  | EngineX Book         0

在这种情况下,您的加入条件应如下所示:

开启(payments.booking_id = purchases.id 且 payments.deleted_at 不为空)

而且这与 WHERE 无关(根据您的 SELECT)。 你应该像这样使用连接闭包:

$query = DB::table('purchases')
->select(['purchases.*', DB::raw("IFNULL(sum(payments.amount),0) as total")])
->leftJoin('payments', function($join) {
    $join->on('payments.booking_id', '=', 'purchases.id');
    $join->on('payments.deleted_at', 'IS', DB::raw('NOT NULL')); 
})
->groupBy('purchases.id')->get();

只需更换

->leftJoin('payments','payments.booking_id','=','purchases.id')

->leftJoin('payments', function($join) {
    $join->on('payments.booking_id', '=', 'purchases.id');
    $join->on('payments.deleted_at', 'IS', DB::raw('NOT NULL')); 
})

并删除这个:

->whereNull('payments.deleted_at')

应该会有帮助。