Я хочу суммировать вложенную коллекцию.
У меня есть следующие таблицы:
- Места
- Предложения
- Заказы
У venue
может быть много offers
, а у offer
может быть много orders
.
Примерные данные могут быть:
Места
id | name
==========================
5 | Pizza 4 Less
10 | Poundland
Предложения
id | venue_id | name
==================================
17 | 5 | Buy 1 get one free
24 | 5 | 30% off pizza
32 | 10 | 50% off
50 | 10 | 20% off
Заказы
id | offer_id | bill | paid
===========================
85 | 17 | 15 | true
86 | 17 | 20 | true
87 | 17 | 90 | true
88 | 24 | 14 | true
89 | 32 | 15 | true
90 | 32 | 65 | true
91 | 50 | 24 | true
92 | 50 | 1000 | false
Я хочу использовать модель Laravel Elqouent, чтобы получить общую сумму, уплаченную за каждое место. Итак, для приведенных выше данных я хочу получить следующий результат:
id | name | total_paid
===============================
5 | Pizza 4 Less | 139
10 | Poundland | 104
Обратите внимание, что итоговые суммы не включают неоплаченные заказы (например, заказ 92).
В настоящее время я делаю это следующим образом:
$venues = Venue::with(['offers.orders' => function ($query) {
$query->where('paid', '=', true);
}])
->get();
$totals = [];
foreach ($venues as $venue) {
$totalPaid = 0;
foreach ($venue->offers as $offer) {
$totalPaid += $offer->orders->sum('bill');
}
$totals[$venue->name] = $totalPaid;
}
Как видите, код выше неэффективный и длинный.
Есть лучший способ сделать это?