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

17
我有两个数组,$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个回答

31

这很简单。您可以使用集合的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());

我理解它应该如何工作,但它似乎并不按照我的意图工作。这是两个集合呈现的图片。(http://i.imgur.com/JGIN5en.png)如果我的推理正确,那么可用角色不应该有任何内容,因为用户已经被分配了这些角色。 - Rijnhardt
1
啊,我明白了。你根本不想将它们合并在一起。你想要的是两者之间的差异。尝试使用$available_roles = $user_roles->diff($global_roles);或者$available_roles = $global_roles->except($user_roles->modelKeys()); - lukasgeiter
谢谢,这正是我所需要的! - Rijnhardt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接