我有一个库存移动表,显示了产品的历史记录(接收、移动位置等)。
我有两个查询,分别计算(通过聚合求和):
- 原始接收数量。
- 当前活跃数量(在物品移动后)。
这两个查询都返回相同模型的集合。它们总是具有相同数量的结果,并且产品ID始终相同。唯一不同的部分是接收/活跃数量,我希望能将单个记录合并到新的集合中。例如:
查询1返回的单个记录:
0 => StockMovement {#1602 ▼
#original: array:2 [▼
"live_qty" => "8"
"product_id" => "2606598e-4150-461a-9e91-10d67cce8daa"
]
}
查询2中的单条记录;
0 => StockMovement {#1602 ▼
#original: array:2 [▼
"received_qty" => "15"
"product_id" => "2606598e-4150-461a-9e91-10d67cce8daa"
]
}
我试图得到一个合并的结果,它的样子如下所示:
0 => StockMovement {#1602 ▼
#original: array:3 [▼
"received_qty" => "15"
"live_qty" => "8"
"product_id" => "2606598e-4150-461a-9e91-10d67cce8daa"
]
}
我希望以一种不将Product对象转换为数组的方式来完成此操作,因为我需要其中嵌入的关系。
目前,我已经通过以下方式进行了hack:
$live = $this->liveQtyCollection();
$merged = $this->receivedQtyCollection()->map(function(StockMovement $received) use($live){
$line = $live->where('product_id', $received->product_id)->first();
return arrayToObject(array_merge($received->toArray(), $line->toArray()));
});
return $merged;
arrayToObject
函数,可以递归地将数组转换回对象,以便我可以像在其原始集合时一样使用箭头选择器,但我确定一定有更好的方法!
我尝试了:
- 合并(Merge)
- 联合(Union)
- 全部(All)
我的最终目标是能够按以下方式使用生成的集合:
@foreach($stockMovements as $stockMovement)
{{ $stockMovement->id }}
{{ $stockMovement->live_qty }}
{{ $stockMovement->received_qty }}
@endforeach