在laravel雄辩的集合上的Array_unique

And*_*gan 13 php array-unique laravel eloquent laravel-4

不确定这是否可行,但我试图在我拥有的项目集合上运行array_unique,以删除重复项.虽然我不能让它工作.

我的控制器逻辑:

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

        return $job->country;
    });
    $countries = array_unique( $countries->toArray() );
Run Code Online (Sandbox Code Playgroud)

虽然这会得到"数组到字符串转换"错误

Jor*_*.it 31

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

$countries = $countries->unique();
Run Code Online (Sandbox Code Playgroud)

Collection类有几个很棒的方法.您可以在Laravel API文档中阅读相关内容.

我同意有时在内存中对现有Collection进行"查询"更有效(而不是使用Querybuilder类对数据库进行另一次查询),例如你首先想要计算然后过滤.在.NET LINQ中,您可以在数据库上查询IEnumerable(内存中集合),这是我真正喜欢的.


oru*_*pov 6

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

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

$countries->unique('code');
Run Code Online (Sandbox Code Playgroud)

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

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

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


Rub*_*zzo 2

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

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

dd($uniques);
Run Code Online (Sandbox Code Playgroud)