合并两个 Eloquent Collections 并删除所有重复项。

Posted

技术标签:

【中文标题】合并两个 Eloquent Collections 并删除所有重复项。【英文标题】:Merge two Eloquent Collections and remove all duplicates. 【发布时间】:2015-06-09 08:58:28 【问题描述】:

我有两个数组,$user_roles$global_roles。我想创建一个新数组,我们称之为$available_roles,它可以等同于$global_roles中的项目减去$user_roles中的项目

我有以下代码可以对普通数组执行此操作。 $available_roles = array_unique(array_merge($global_roles, $user_roles), SORT_REGULAR);

事实证明这是有问题的,因为 Laravel 在执行查询时不使用传统数组,而是使用 Eloquent 集合。

你们还有什么其他想法?

【问题讨论】:

【参考方案1】:

这很简单。您可以使用 Collection 的merge 方法:

$available_roles = $global_roles->merge($user_roles);

因为merge 内部使用了一个以 id 作为键的关联数组(字典),这应该会自动删除重复项。

不过,您可以使用unique 删除集合中的重复项:

$uniqueCollection = $collection->unique();

现在是合并,您实际上正在寻找的是两个集合之间的差异。您可以通过两种方式做到这一点:

$available_roles = $user_roles->diff($global_roles);

$available_roles = $global_roles->except($user_roles->modelKeys());

【讨论】:

我了解它应该如何工作,但它似乎并没有按照我的预期工作。这是两个集合看起来像渲染的图片。 (i.imgur.com/JGIN5en.png) 如果我的推理是正确的,那么可用角色不应该为空,因为用户已经拥有分配给他的角色 啊,我明白了。您根本没有尝试合并它们。你想要的是两者之间的区别。试试$available_roles = $user_roles->diff($global_roles);$available_roles = $global_roles->except($user_roles->modelKeys()); 谢谢,这正是我所需要的!

以上是关于合并两个 Eloquent Collections 并删除所有重复项。的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 模型使用多个表合并为一个(没有单独的模型)

合并两个有序数组

为啥 Collections.sort 使用合并排序而不是快速排序?

collections.ChainMap类合并字典或映射

在 Eloquent 上连接两个表

Laravel Eloquent 查询两个表