php - 如何对 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,
},
],
}
如您所见,有一个元素(带有id
3 的元素)具有两个角色并显示两次
有一种方法或助手可用于对集合进行分组并获得如下内容:
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],
},
],
}
解决方案
没有更多信息,我会这样做:
$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());
推荐阅读
- docker - docker-compose 无法识别 sudoers 容器文件
- reactjs - React App 中的多个子域 + 入口点
- python - 基于数据框的 INSERT INTO SELECT
- llvm - LLVM - 如何将参数传递给函数调用| 错误:调用签名错误的函数
- .net - 在 dotnet core 中添加类库作为项目引用也会导致访问其依赖项
- android - 如何从 recyclerView 中删除项目?
- python - 给出公差比较列表中的浮点数
- php - 为前端选择网站架构/逻辑/结构以及如何实现它
- azure - Azure Functions:为什么我在 Kudu 中看到两个 w3wp 进程?
- python-3.x - 使用 kivymd 的文件管理器代码不起作用