Я пытаюсь суммировать столбец при группировании по данным в таблице, а также по связанной таблице.
Таблица заказов
- id
- location_id
- дата_ получения
Таблица позиций заказа
- id
- order_id
- product_id
- Кол-во
Отношения
Позиция заказа принадлежит заказу
public function order() : BelongsTo
{
return $this->belongsTo(Order::class);
}
Запрос
Я ищу результат:
- product_id (groupBy в таблице order_items)
- location_id (groupBy в таблице заказов)
- Кол-во (сумма в таблице order_items)
Следующее получает коллекцию с правильными группами:
$items = OrderItem::with(['order'])
->get()
->groupBy(['fulfilment_location_id', 'product_id']);
Затем я могу пройти по этому массиву, чтобы получить результат IЯ искал следующее:
$result = [];
foreach($items as $location_id => $products_collection){
foreach($products_collection as $product_id => $order_items_collection){
$sum = $order_items_collection->sum(function(OrderItem $oi){
return $oi->qty;
});
isset($result[$location_id][$product_id]) ?
$result[$location_id][$product_id] += $sum :
$result[$location_id][$product_id] = $sum;
}
}
... однако это выглядит очень долго.Я мог бы получить результат намного проще, просто скопировав столбец location_id из таблицы orders в таблицу order_items, но это не очень приятно.Я надеялся, что найдется более простой способ, который использует eloquent (вместо написания необработанного запроса).