将 Laravel 集合附加到另一个集合

Posted

技术标签:

【中文标题】将 Laravel 集合附加到另一个集合【英文标题】:Append a Laravel collection with another collection 【发布时间】:2017-07-18 14:19:01 【问题描述】:

我正在尝试在 Laravel 5.3 中将 Eloquent 集合与另一个 Eloquent 集合相附加。

这是我到目前为止所做的:

$entries = Entry::all();
$posts   = Post::all();

$entries->merge($posts);

我尝试使用merge(),如上面的代码所示,但似乎我遇到了这种问题(因为其中一些具有相同的id 具有相同的值):

Collection merge eating up some rows

有什么想法吗?

【问题讨论】:

第一个集合中存储了什么?没有代码很难回答 我更新了我的问题 尝试迭代第二个集合并将每个元素推送到第一个集合上。 laravel.com/docs/5.4/collections#method-push 您还需要它作为收藏吗?如果没有,你可以这样做:array_merge($entries->all(), $posts->all()); @ad4s 嗯,有道理,但是听起来效率有点低,如果我有超过 2 个集合怎么办?还有其他选择吗? 【参考方案1】:

对于

$mergedCollection = $entries->toBase()->merge($posts);

对于 >= 5.4 的版本,您可以按照 Jason 的建议使用 concat

【讨论】:

这似乎有效,很抱歉添加其他问题,但如果我有 3 个雄辩的收藏集怎么办?假设$entries$posts$users?在合并另一个之前,我是否需要每次都致电toBase()?还是直接merge() 我认为您每次想要合并到当前收藏时都必须致电toBase()。但你最好的选择是在一个小型原型中进行尝试:) 如果键相同,merge 会将旧集合中的值覆盖为新集合的值。不是,问的是什么。 toBase 并没有解决问题,因为它所做的只是复制初始集合。 我不得不投反对票,因为concat 是这种情况下的正确方法。 最初的问题是针对 laravel 5.3 的,它没有 concat 方法,我更新了我的答案,提供了有关版本的更多信息以及指向 concat 答案的链接。【参考方案2】:

merge() 方法接收一个数组,所以你必须做类似的事情

$entries->merge($posts->toArray());

Laravel Collections: merge() method

【讨论】:

我收到错误Call to a member function getKey() on array 显然你必须把 Illuminate\Database\Eloquent\Collection 变成 Illuminate\Support\Collection:像这样:collect($entries)->merge($posts->toArray());more info here 你的意思是$entries->merge($posts->all());toArray 还将您的模型属性更改为数组。【参考方案3】:

我相信您可能正在寻找concat()。这会将一个容器附加到另一个容器的末尾,而不管其中任何一个的键。

$mergedCollection = $entries->concat($posts);

【讨论】:

这是正确的答案,因为它确实是附加的。它确实会破坏密钥,但这应该是重点,否则合并是选择的工具。【参考方案4】:

如果您需要合并 big_products 和 small_products:

$products = $bigProducts->values()->merge($smallProducts->values());

merge 方法将给定的数组或集合与原始集合合并。如果给定项目中的字符串键与原始集合中的字符串键匹配,则给定项目的值将覆盖原始集合中的值。

但是

如果给定项的键是数字,则值将附加到集合的末尾:

因此,您所需要的只是摆脱键,您可以使用->values() 函数来完成。

在 Laravel-6 上测试

【讨论】:

解决了我的问题,合并了两个不同的 eloquent 合集【参考方案5】:

这是链接:laravel7.X

$collection = collect(['Desk', 'Chair']);

$merged = $collection->merge(['Bookcase', 'Door']);

$merged->all();

【讨论】:

以上是关于将 Laravel 集合附加到另一个集合的主要内容,如果未能解决你的问题,请参考以下文章

在jquery中循环laravel数组集合

将 C# 集合复制到另一个集合 [关闭]

将信息从一个集合视图传递到另一个更详细的集合视图的最佳方法是啥

使用 Mongoose 将文档移动到另一个集合

如何以相反的顺序将文档从一个集合添加到另一个集合?

将数据从集合视图单元格内的表视图单元格传输到另一个集合视图单元格 [带图片!]