首页 > 解决方案 > 如何对 MySQL GROUP_CONCAT 之类的 laravel 集合进行分组

问题描述

我有一个 Laravel 函数,它从两个或三个以上的单独集合(不同的 BD 查询)返回这个结果合并集合:

Illuminate\Support\Collection {#3361
     all: [
       {#3359
         +"id": 3,
         +"name": "Jose Achecar",
         +"role": 1,
       },
       {#3344
         +"id": 1,
         +"name": "Oswaldo Graterol",
         +"role": 1,
       },
       {#3384
         +"id": 4,
         +"name": "Assaily",
         +"role": 2,
       },
       {#3372
         +"id": 3,
         +"name": "Jose Achecar",
         +"role": 2,
       },       
       {#3349
         +"id": 5,
         +"name": "Alejandro",
         +"role": 1,
       },
       {#3382
         +"id": 2,
         +"name": "Marcos Mendozas",
         +"role": 2,
       },
     ],
   }

如您所见,有一个元素(带有id3 的元素)具有两个角色并显示两次

有一种方法或助手可用于对集合进行分组并获得如下内容:

  Illuminate\Support\Collection {#3361
     all: [
       {#3359
         +"id": 3,
         +"name": "Jose Achecar",
         +"role": [1,2],
       },
       {#3344
         +"id": 1,
         +"name": "Oswaldo Graterol",
         +"role": [1],
       },
       {#3384
         +"id": 4,
         +"name": "Assaily",
         +"role": [2],
       },    
       {#3349
         +"id": 5,
         +"name": "Alejandro",
         +"role": [1],
       },
       {#3382
         +"id": 2,
         +"name": "Marcos Mendozas",
         +"role": [2],
       },
     ],
   }

标签: phplaravellaravel-7laravel-collection

解决方案


没有更多信息,我会这样做:

$coll = $coll->reduce(function($carry, $item) {
  if (!$carry->contains('id', $item->id)) {
    $newItem = clone $item;
    $newItem->role = [ $newItem->role ];
    $carry->push($newItem);
  } else {
    $carry->firstWhere('id', $item->id)->role[] = $item->role;
  }
  return $carry;
}, new Illuminate\Support\Collection());

推荐阅读