首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拉勒维尔雄辩-合并两个雄辩的模型结果(而不是集合)

拉勒维尔雄辩-合并两个雄辩的模型结果(而不是集合)
EN

Stack Overflow用户
提问于 2019-04-17 19:46:30
回答 3查看 8.9K关注 0票数 5

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

我有两个查询(通过合计金额计算):

  1. 原件收到了数量。
  2. 当前的实时质量(在事物被移动之后)。

这两个查询都返回相同模型的集合。它们的结果总是相同的,而product的结果总是相同的。唯一不同的部分是接收到的/活的数量,我想以某种方式将各个记录合并到一个新的集合中。即

查询1中的单个记录:

代码语言:javascript
复制
0 => StockMovement {#1602 ▼
  #original: array:2 [▼
    "live_qty" => "8"
    "product_id" => "2606598e-4150-461a-9e91-10d67cce8daa"
  ]
}

查询2中的单个记录;

代码语言:javascript
复制
0 => StockMovement {#1602 ▼
  #original: array:2 [▼
    "received_qty" => "15"
    "product_id" => "2606598e-4150-461a-9e91-10d67cce8daa"
  ]
}

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

代码语言:javascript
复制
0 => StockMovement {#1602 ▼
  #original: array:3 [▼
    "received_qty" => "15"
    "live_qty" => "8"
    "product_id" => "2606598e-4150-461a-9e91-10d67cce8daa"
  ]
}

我想以一种不将Product转换为数组的方式这样做,因为我需要嵌入其中的关系。

目前,我对此进行了如下攻击:

代码语言:javascript
复制
$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函数,递归地将数组转换回对象,以便我可以使用箭头选择器的方式与其原始集合的方式相同,但我确信一定有更好的方法!

我试过:

  • 合并
  • 友联市

我的最终目标是能够按以下方式使用结果集合:

代码语言:javascript
复制
@foreach($stockMovements as $stockMovement)
    {{ $stockMovement->id }}
    {{ $stockMovement->live_qty }}
    {{ $stockMovement->received_qty }}
@endforeach
EN

回答 3

Stack Overflow用户

发布于 2019-04-17 20:38:48

您可以使用以下代码:

代码语言:javascript
复制
$collection = collect();
$cars = Car::all();
$bikes = Bike::all();

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

foreach ($bikes as $bike)
    $collection->push($bike);

来源

票数 6
EN

Stack Overflow用户

发布于 2020-12-04 02:54:25

我知道你在你的问题中提到,你并不是指集合,而且你已经尝试过合并,但是为了讨论,我想我应该把我的答案放在混合中,因为这正是我所需要的;合并了两个模型调用的响应。

代码语言:javascript
复制
$quote = \App\AllQuotes::withoutGlobalScopes()->find($quote_id);
$settings = \App\Settings::findOrFail(1);
$settings = collect($settings);
$quote = collect($quote);
$merged = $quote->merge($settings);

return $merged;

您必须首先将模型响应封装为集合,然后将它们合并在一起。然后,输出将其视为一个逻辑连接,将来自两个模型的数据保持在一个单一输出中。

票数 1
EN

Stack Overflow用户

发布于 2019-04-17 21:29:09

你可以这样做:

代码语言:javascript
复制
$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;
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55734956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档