1

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

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]]

是否有可能在一行中实现这样的目标?

然后 summation 将是微不足道的groupBy('item'),然后是适当的sum

4

1 回答 1

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();

希望能帮助到你。

于 2017-03-25T14:12:47.327 回答