Php Laravel雄辩-合并两个雄辩的模型结果(不是集合)
我有一张库存变动表,它显示了产品的历史记录(接收、移动位置等) 我有两个查询(通过合计金额)进行计算:Php Laravel雄辩-合并两个雄辩的模型结果(不是集合),php,laravel,eloquent,query-builder,laravel-query-builder,Php,Laravel,Eloquent,Query Builder,Laravel Query Builder,我有一张库存变动表,它显示了产品的历史记录(接收、移动位置等) 我有两个查询(通过合计金额)进行计算: 原始接收数量 当前活动数量(物品移动后) 这两个查询都返回相同模型的集合。它们在每一项中的结果数始终相同,并且产品id始终相同。唯一不同的部分是接收/活动数量,我想以某种方式将各个记录合并到一个新集合中。i、 e 查询1中的单个记录: 0 => StockMovement {#1602 ▼ #original: array:2 [▼ "live_qty" => "8"
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"
]
}
我希望这样做不会将产品对象转换为数组,因为我需要嵌入其中的关系
目前,我已经对其进行了如下黑客攻击:
$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;
@foreach($stockMovements as $stockMovement)
{{ $stockMovement->id }}
{{ $stockMovement->live_qty }}
{{ $stockMovement->received_qty }}
@endforeach
arrayToObject
函数递归地将数组转换回一个对象,这样我就可以像使用原始集合时一样使用箭头选择器,但我相信一定有更好的方法
我试过:
- 合并
- 联合
- 全部
$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;
@foreach($stockMovements as $stockMovement)
{{ $stockMovement->id }}
{{ $stockMovement->live_qty }}
{{ $stockMovement->received_qty }}
@endforeach
您可以使用以下代码:
$collection = collect();
$cars = Car::all();
$bikes = Bike::all();
foreach ($cars as $car)
$collection->push($car);
foreach ($bikes as $bike)
$collection->push($bike);
您可以这样做:
$live = $this->liveQtyCollection()->keyBy('product_id')
$merged = $this->receivedQtyCollection()->map(function(StockMovement $received) use($live){
$received->live_qty = $live->get($received->product_id)->live_qty ?? null;
return $received;
});
我知道你在你的问题中提到,你不是指集合,而且你已经尝试过合并,但为了讨论,我想我会把我的答案放在混合中,因为这正是我所需要的;合并两个模型调用的响应
$quote = \App\AllQuotes::withoutGlobalScopes()->find($quote_id);
$settings = \App\Settings::findOrFail(1);
$settings = collect($settings);
$quote = collect($quote);
$merged = $quote->merge($settings);
return $merged;
您必须首先使用
collect
helper将模型响应封装为集合,然后才能将它们合并在一起。然后,输出将其视为一个逻辑联接,将来自两个模型的数据保持在一个单独的输出中。“Eloquent返回的所有多结果集都是Lightlight\Database\Eloquent\Collection对象的实例”。你为什么说不收集?我想我认为收集是“雄辩的模型结果的收集”。我想确保我不会将stockMovement模型分解为数组或普通集合,即我想通过product_Š保留其所有关系功能,例如$stockMovement->product->title
,其中stockMovement属于某个产品,我想您可以尝试以下方法:@loic.lopez谢谢。我已经知道什么是关系了。我只是尝试合并上面两个查询,同时保持关系完整。如果在合并之前转换为数组,则关系将丢失。