使用Laravel集合方法汇总多个购物车中的总项目

时间:2017-03-25 06:52:02

标签: php laravel aggregate laravel-collection

假设我有一个有关系的购物车:

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

假设每个$carts有多个$cart->items,我想生成此购物车中所有项目的列表,并在pivot.quantity上加上总和。

e.g:

[
  {'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 个答案:

答案 0 :(得分: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();

希望它有所帮助。