我继承了一个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;
});
});
然而,显然它只考虑到项目名称是相同的,然后求和它,但我还需要验证列表和状态。我一直用这个把头撞在墙上,所以我觉得这一定是我忽略的简单的事情。希望有人能看到我错过了什么。
性能不是很好,但暂时:
// 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