提问者:小点点

Laravel 5.4中多维集合中的合并副本和求和字段


我继承了一个Laravel 5.4项目。升级不是一个选项,也不是一个大规模的重写,所以我坚持我所拥有的。我有一个有说服力的集合,从数据库中提取并简化后如下所示:

订单代码

[
  {
    "item": Item 1,
    "status": 3,
    "qty": 2,
    "hotlist": null
  },
  {
    "item": Item 1,
    "status": 4,
    "qty": 5,
    "hotlist": null
  },
  {
    "item": Item 1,
    "status": 3,
    "qty": 1,
    "hotlist": true
  },
  {
    "item": Item 1,
    "status": 3,
    "qty": 1,
    "hotlist": null
  },
]

显然有不止一个项目,但这将显示我或多或少在做什么,以及我需要完成什么。我试图给一个项目的报告。如果它们是相同的项目,处于相同的状态,并且不在热列表中,它们应该是总量的一行项目。使用上面的例子,我需要一个输出,像这个例子:

[
  {
    "item": Item 1,
    "status": 3,
    "qty": 3,
    "hotlist": null
  },
  {
    "item": Item 1,
    "status": 4,
    "qty": 5,
    "hotlist": null
  },
  {
    "item": Item 1,
    "status": 3,
    "qty": 1,
    "hotlist": true
  },
]

唯一的变化是第一个和最后一个项目的数量已合计,重复项目已删除。我使用了以下代码:

$orders->groupBy('item')->flatMap(function ($items) {
  $quantity = $items->sum('qty');
  return $items->map(function ($item) use ($quantity) {
     $item->qty = $quantity;
     return $item;
  });
});

然而,显然它只考虑到项目名称是相同的,然后求和它,但我还需要验证列表和状态。我一直用这个把头撞在墙上,所以我觉得这一定是我忽略的简单的事情。希望有人能看到我错过了什么。


共1个答案

匿名用户

性能不是很好,但暂时:

// make it a collection so we can use the helper methods
$collection = collect([]); 

$orders->each(function ($item) use ($collection) {
   $target = $collection->where('item', $item->item)
                        ->where('hotlist', $item->hotlist)
                        ->where('status', $item->status);
   if ($target->count() == 0) 
      $collection->push($item); // If it hasn't been added, add it to the collection
   else
      $target->first()->qty += $item->qty;
});

dd($collection); // double check