Я хочу получить все покупки и их суммы, а также не хочу добавлять сумму, если бы значение 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
В этом случае ваше условие соединения должно выглядеть так:
ВКЛ (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')
это должно помочь.
Других решений пока нет …