Суммируйте общее количество товаров в нескольких корзинах, используя методы сбора Laravel

Скажем, у меня есть корзина с отношениями:

public function items()
{
return $this->belongsToMany(Item::class, 'cart_item', 'cart_id', 'item_id')->withPivot('quantity');
}

Скажи, у меня есть несколько $carts с каждым $cart->items и я хочу создать список всех товаров в этой корзине с суммированием по pivot.quantity,

например:

[
{'item': Apple, 'pivot.quantity': 2},
{'item': Orange, 'pivot.quantity': 1},
]

[
{'item': Apple, 'pivot.quantity': 4},
{'item': Banana, 'pivot.quantity': 1},
]

Будет производить

[
{'item': Apple, 'pivot.quantity': 6},
{'item': Banana, 'pivot.quantity': 1},
{'item': Orange, 'pivot.quantity': 1},
]

Моя мысль будет первой перебрать все $carts составить список вроде этого:

[$cart[0]->items[0], $cart[0]->items[1], …, $cart[n]->items[n]]

Можно ли добиться чего-то подобного в одну строчку?

Тогда суммирование будет тривиальным groupBy('item') с соответствующим sum,

1

Решение

Это должно работать

 $carts = [
// this is your array;
];

$newCart = collect($carts)->flatten(1)->groupBy("item")->map(function($q){
$item = $q->first()['item'];

$quantity = $q->reduce(function($carry, $item){
// Use this, as your quantity is not an object
// of pivot
return $carry + $item['pivot.quantity'];
// use this if quantity is an object of pivot
return $carry + $item['pivot']['quantity'];
});

return compact("item","quantity");
})->values();

Надеюсь, поможет.

1

Другие решения

Других решений пока нет …