18

Not sure if this is possible but im trying to run array_unique over a collection of items i have, to remove duplicates. Although i cannot get it working.

my controller logic:

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

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

although this gets a "Array to string conversion" error

4

4 回答 4

37

您可以尝试 Collection 类的 Unique 方法:

$countries = $countries->unique();

Collection 类有几个很棒的方法。你可以在Laravel API 文档中阅读到这一点。

我同意有时对内存中的现有集合“查询”更有效(而不是使用 Querybuilder 类对数据库进行另一个查询),例如您首先要计数然后过滤。在 .NET LINQ 中,您几乎可以在 IEnumerable(内存中的集合)上进行查询,就像在数据库上一样,这是我非常喜欢的。

于 2014-03-26T12:22:16.897 回答
6

我有类似的问题,虽然时间已经过去,因为它可能对今天的某人有用。

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

$countries->unique('code');

这样,您将只有具有唯一代码的国家/地区。您可能会注意到只有第一个值保留,因此如果您开发一个购物车应用程序并且出于某种原因想要合并购物车并且只想拥有最近的项目,您可以反转集合并调用unique并将其反转回来:

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

这可能不是最好的选择,最好在数据库端进行过滤,但有选项很好。

于 2016-04-14T05:40:12.013 回答
2

您可以使用distinctgroup by在您的 select 子句中在数据库结果中具有唯一值。但是,如果您确实需要在对象数组上具有唯一值,您可以执行以下操作:

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

dd($uniques);
于 2013-09-05T14:51:56.487 回答
0

如果这正是您想要做的,您可以尝试对 eloquent 集合使用 filter 方法

http://laravel.com/docs/eloquent#collections

于 2013-09-05T14:47:18.497 回答