Рассчитать сумму, используя Laravel Query Builder, применяя groupBy к Table1.id, но без мягко удаленных строк в Table2?

Я хочу получить все покупки и их суммы, а также не хочу добавлять сумму, если бы значение payment.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();

Когда я запускаю код ниже, 1-й результат не включается.
Результат

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

Я знаю, почему это не входит, но проблема в том, если я удаляю whereNull ( ‘payments.deleted_at’) этот конкретный ряд в платежах
также добавит к сумме. Как я должен решить это ??

ожидаемый результат

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

0

Решение

В этом случае ваше условие соединения должно выглядеть так:

ВКЛ (payment.booking_id = buyases.id И payment.deleted_at НЕ НУЖНО)

И речь не о ГДЕ (согласно вашему SELECT).
Вы должны использовать join-closure следующим образом:

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

это должно помочь.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]