Я пытаюсь получить сумму поступлений и вычетов по всем счетам за работу. В квитанциях есть 2 записи с суммами 80 000 рупий и 10 000 рупий. Есть 2 записи в отчислениях с суммами 500 и 100 рупий.
В результате я получаю: Общие вычеты - 1200 рупий (вдвое больше фактических 600 рупий). Общая сумма поступлений - 180 000 рупий (вдвое больше фактических 90 000 рупий).
Мой красноречивый запрос выглядит следующим образом:
$bills = bills::leftjoin('receipts', 'receipts.billId', 'bills.billId')->leftjoin('deductions', 'deductions.billId', 'bills.billId')
->select('bills.billId', 'bills.billDate', 'bills.billNumber', 'bills.billStatus', 'bills.billAmount', DB::raw('SUM(deductions.deductionAmount) as totalDeductions'), DB::raw('SUM(receipts.receiptAmount) as totalReceipts'))
->groupBy('bills.billId', 'bills.billDate', 'bills.billNumber', 'bills.billStatus', 'bills.billAmount')
->where('bills.workId', $workId)
->get();
Ссылка на скрипт SQL - http://www.sqlfiddle.com/#!9/cf46cb/1/0


Если вы удалите группировку и SUM, вы увидите все возвращаемые строки и то, что ваши левые соединения вызывают ошибку дублирования:
SELECT `bills`.`billId`, `bills`.`billDate`, `bills`.`billNumber`, `bills`.`billAmount`,
deductions.deductionAmount,
receipts.receiptAmount
FROM `bills` left join `receipts` on `receipts`.`billId` = `bills`.`billId`
left join `deductions` on `deductions`.`billId` = `bills`.`billId`
WHERE `bills`.`workId` = 6
Вы можете избежать этого с помощью подзапросов, но я понятия не имею, как это сделать с Eloquent:
SELECT b.`billId`, b.`billDate`, b.`billNumber`, b.`billAmount`,
(SELECT SUM(deductionAmount) FROM deductions WHERE BillID = b.BillId) as totalDeductions,
(SELECT SUM(receiptAmount) FROM receipts WHERE BillID = b.BillId) as totalReceipts
FROM `bills` b
WHERE b.`workId` = 6
Хорошо, вот как это будет сделано в Eloquent:
$bills = bills::select('bills.billId', 'bills.billDate', 'bills.billNumber', 'bills.billStatus', 'bills.billAmount',
DB::raw("(SELECT SUM(deductionAmount) FROM deductions WHERE billId = bills.billId) as totalDeductions"),
DB::raw("(SELECT SUM(receiptAmount) FROM receipts WHERE billId = bills.billId) as totalReceipts"))
->groupBy('bills.billId', 'bills.billDate', 'bills.billNumber', 'bills.billStatus', 'bills.billAmount')
->where('bills.workId', $workId)
->get();
Спасибо, Рассел. Теперь работает. Я разместил это как ответ.