将 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 集合附加到另一个集合的主要内容,如果未能解决你的问题,请参考以下文章