过滤集合没有重复

时间:2014-12-30 14:28:32

标签: laravel

我有一个类似下面的laravel集合:

[
   {
      "id":2,
      "name":"Product 1",
      "awards":[
         {
            "id":1,
            "name":"Award 1",
            "pivot":{
               "product_id":2,
               "award_id":1
            }
         },
         {
            "id":2,
            "name":"Award 2",
            "description":"Quae sint vero id iste.",
            "pivot":{
               "product_id":2,
               "award_id":2
            }
         },
         {
            "id":3,
            "name":"Award 3",
            "pivot":{
               "product_id":2,
               "award_id":3
            }
         },
      ]
   },
   {
      "id":3,
      "name":"Product 2",
      "awards":[
         {
            "id":2,
            "name":"Award 2",
            "pivot":{
               "product_id":3,
               "award_id":12
            }
         },
         {
            "id":3,
            "name":"Award 3",
            "pivot":{
               "product_id":3,
               "award_id":13
            }
         },
         {
            "id":14,
            "name":"Award 4",
            "pivot":{
               "product_id":3,
               "award_id":14
            }
         },
      ]
   }
]

有没有办法可以获得如下所示的集合,所有奖项,没有重复:

      "awards":[
         {
            "id":1,
            "name":"Award 1",
            "pivot":{
               "product_id":2,
               "award_id":1
            }
         },
         {
            "id":2,
            "name":"Award 2",
            "description":"Quae sint vero id iste.",
            "pivot":{
               "product_id":2,
               "award_id":2
            }
         },
         {
            "id":3,
            "name":"Award 3",
            "pivot":{
               "product_id":2,
               "award_id":3
            }
         },
         {
            "id":12,
            "name":"Award 2",
            "pivot":{
               "product_id":3,
               "award_id":12
            }
         },
         {
            "id":14,
            "name":"Award 4",
            "pivot":{
               "product_id":3,
               "award_id":14
            }
         },
      ]

我知道Laravel集合类有很多方法(比如过滤器等),但是我很难让它们跨越对象工作 - 例如在这里我有两个我几乎想要的对象< / p>

combine('awards')->unique()

......有点儿。

修改

我得到的初始阵列非常简单,一个包含许多产品的盒子和产品都有奖项,所以我想说,这个盒子总共有x,y,z奖。无论如何,这是查询(以上是return $box的结果):

$box = Box::with('products.awards')->find($id);

3 个答案:

答案 0 :(得分:5)

这是真正简单的方法。

$awardsArray = $products->lists('awards');
$awardsDirty = new Collection($awardsArray);
$awards = $awardsDirty->unique();

答案 1 :(得分:1)

这是我能想到的最佳方式:

$awards = new \Illuminate\Database\Eloquent\Collection;
foreach($products as $product){
    $awards = $awards->merge($product->awards);
}

关于merge和Eloquent集合的好处是它们使用id作为唯一标识符,因此您的副本将被自动删除。

答案 2 :(得分:1)

在Laravel版本 5.2 之后,collection->lists()已被标记为已弃用方法。替代解决方案将是:

$awards = collect($products)
        ->pluck("awards")
        ->flatten(1)
        ->unique("id");