Array_unique在一个华丽而雄辩的系列中



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

我的控制器逻辑:

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

尽管这会导致"数组到字符串转换"错误

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

$countries = $countries->unique();

Collection类有几个很棒的方法。您可以在Laravel API文档中了解到这一点。

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

我也遇到过类似的问题,尽管时间已经过去了,但它可能对今天的人有用。

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

$countries->unique('code');

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

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

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

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

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

如果正是你想要做的,你可以在雄辩的集合上尝试filter方法

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

相关内容

  • 没有找到相关文章

最新更新