Laravel 5.6 / Eloquent Sum и GroupBy со связанными таблицами / отношениями - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь суммировать столбец при группировании по данным в таблице, а также по связанной таблице.

Таблица заказов

  • 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 (вместо написания необработанного запроса).

1 Ответ

0 голосов
/ 31 декабря 2018

Что-то вроде этого:

$items = OrderItem::select(DB::raw('sum(order_items.qty) as sumqty, o.location_id as lcoation, order_items.product_id as product_id'))
            ->leftJoin('orders as o', 'o.id', 'order_items.order_id')
            ->groupBy(['product_id', 'lcoation']);

Должно дать вам:

sumqty | location | product_id
---------------------------------
 12       3          12                   // example data  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...