在 Laravel Eloquent 集合中使用 Array_unique

18

我不确定是否可能,但我正在尝试在我的一组项目上运行array_unique以删除重复项。尽管我无法让它正常工作。

我的控制器逻辑:

    // init models
    $jobs = Job::search();
    $countries = $jobs->get()->map(function( $job ) {

        return $job->country;
    });
    $countries = array_unique( $countries->toArray() );

尽管这会导致出现"Array to string conversion"错误


1
我不确定你的数据库表的内容是什么,但是从查询中获取所需结果是否更容易呢?如果你想要调试代码行,请尝试在函数之间打印一些数据,并检查输出是否正确。 - Rob Gordijn
1
你是否尝试在你的查询中使用 ->groupby('country') 或者 ->distinct()->get(array('country')) - Jeemusu
4个回答

37

你可以尝试使用Collection类的Unique方法:

$countries = $countries->unique();

Collection类有许多精彩的方法。您可以在Laravel API文档中阅读相关内容。

我认为,有时候在内存中“查询”现有的Collection(而不是使用QueryBuilder类在数据库中执行另一个查询)会更有效率,例如您首先想要计数然后再过滤。在.NET LINQ中,您几乎可以像在数据库上一样查询IEnumerable(内存集合),这是我非常喜欢的。


7

我有一个类似的问题,虽然时间已经过去了,但今天对某人可能仍然有用。

我的问题是,当我在一组项目上调用 unique 方法时,它不起作用,这可能是第一个答案被接受的原因。因此,如果您有模型,并且您想基于特定字段删除重复项,则可以将参数传递给您的 unique 方法,在这种情况下,它将是:

$countries->unique('code');

这样,您将只拥有具有唯一代码的国家。您可能会注意到,只有第一个值保留下来,因此如果您开发了购物车应用程序并且出于某种原因想要合并购物车并仅想要最近的物品,您可以反转集合并调用unique,然后再次反转它:

$countries->reverse()->unique('code')->reverse(); // it doesn't really make sense in this example though

这可能不是最佳选择,最好在数据库端进行过滤,但有多种选择也是好的。


谢谢你提供这个信息;我在文档中没有看到,但确实有描述并提供了一个例子:https://laravel.com/docs/5.3/collections#method-unique - kjones
非常感谢您提供的reverse()技巧。我已经为此苦苦思索了数小时。 - Afif Zafri

2

在选择语句中使用 distinctgroup by,可以使得数据库结果具有唯一的值。但是,如果您真的需要在一个对象数组中拥有唯一的值,可以执行以下操作:

$uniques = array();
foreach ($countries as $c) {
    $uniques[$c->code] = $c; // Get unique country by code.
}

dd($uniques);

0

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