Laravel Eloquent - 合并两个雄辩模型结果(不是集合)

Ada*_*ert 6 php query-builder laravel eloquent laravel-query-builder

我有一张库存变动表,其中显示了产品的历史记录(接收、移动位置等)

\n\n

我有两个计算的查询(通过总计):

\n\n
    \n
  1. 原始收到数量。
  2. \n
  3. 当前的实时数量(物品移动后)。
  4. \n
\n\n

这两个查询都返回相同模型的集合。它们的结果数量始终相同,并且 Product_id 也始终相同。唯一不同的部分是接收/实时数量,我想以某种方式将各个记录合并到一个新集合中。IE

\n\n

查询 1 中的单个记录:

\n\n
0 => StockMovement {#1602 \xe2\x96\xbc\n  #original: array:2 [\xe2\x96\xbc\n    "live_qty" => "8"\n    "product_id" => "2606598e-4150-461a-9e91-10d67cce8daa"\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

查询 2 中的单个记录;

\n\n
0 => StockMovement {#1602 \xe2\x96\xbc\n  #original: array:2 [\xe2\x96\xbc\n    "received_qty" => "15"\n    "product_id" => "2606598e-4150-461a-9e91-10d67cce8daa"\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我试图最终得到一个合并结果,如下所示:

\n\n
0 => StockMovement {#1602 \xe2\x96\xbc\n  #original: array:3 [\xe2\x96\xbc\n    "received_qty" => "15"\n    "live_qty" => "8"\n    "product_id" => "2606598e-4150-461a-9e91-10d67cce8daa"\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想以一种不将 Product 对象转换为数组的方式来执行此操作,因为我需要嵌入其中的关系。

\n\n

目前,我对此进行了如下破解:

\n\n
$live = $this->liveQtyCollection();\n$merged = $this->receivedQtyCollection()->map(function(StockMovement $received) use($live){\n    $line = $live->where(\'product_id\', $received->product_id)->first();\n    return arrayToObject(array_merge($received->toArray(), $line->toArray()));\n});\nreturn $merged;\n
Run Code Online (Sandbox Code Playgroud)\n\n

arrayToObject函数递归地将数组转换回对象,这样我就可以像原始集合一样使用箭头选择器,但我确信一定有更好的方法!

\n\n

我努力了:

\n\n
    \n
  • 合并
  • \n
  • 联盟
  • \n
  • 全部
  • \n
\n\n

我的最终目标是能够使用生成的集合,如下所示:

\n\n
@foreach($stockMovements as $stockMovement)\n    {{ $stockMovement->id }}\n    {{ $stockMovement->live_qty }}\n    {{ $stockMovement->received_qty }}\n@endforeach\n
Run Code Online (Sandbox Code Playgroud)\n

Jaf*_*ali 8

您可以使用此代码:

$collection = collect();
$cars = Car::all();
$bikes = Bike::all();

foreach ($cars as $car)
    $collection->push($car);

foreach ($bikes as $bike)
    $collection->push($bike);
Run Code Online (Sandbox Code Playgroud)

来源