如何从Doctrine获取按ID分组的非空origin多维数组?
解决方案
两种方式都能实现你的需求,下面分别说明:
一、直接通过数据库查询生成(以MySQL为例)
如果你的数据库支持JSON聚合函数(比如MySQL 5.7+、PostgreSQL等),可以直接用查询语句生成结构化结果,再转成数组即可:
MySQL查询语句
SELECT JSON_ARRAYAGG( JSON_OBJECT('id', id, 'origin', origin) ) AS grouped_data FROM your_table_name WHERE origin IS NOT NULL AND origin != '' GROUP BY id;
这条语句会先过滤掉origin为空的记录,再按id分组,把每组的记录转为JSON对象后聚合为JSON数组。拿到结果后,在PHP里用json_decode()就能转成你要的多维数组。
PostgreSQL查询语句
如果用PostgreSQL,语法类似:
SELECT json_agg(json_build_object('id', id, 'origin', origin)) AS grouped_data FROM your_table_name WHERE origin IS NOT NULL AND origin != '' GROUP BY id;
二、用PHP处理查询结果
要是数据库不支持JSON函数,或者你更习惯在代码层处理,也可以先查出数据再分组:
1. 查询符合条件的记录
// 假设已通过PDO建立数据库连接 $stmt = $pdo->query("SELECT id, origin FROM your_table_name WHERE origin IS NOT NULL AND origin != '' ORDER BY id"); $records = $stmt->fetchAll(PDO::FETCH_ASSOC);
2. 手动分组生成目标数组
$groupedData = []; foreach ($records as $item) { $id = $item['id']; if (!isset($groupedData[$id])) { $groupedData[$id] = []; } $groupedData[$id][] = $item; } // 去掉键名,转为纯多维数组 $result = array_values($groupedData);
$result就是你需要的格式。
总结
- 数据库查询方式更高效,数据量大时能减少PHP的内存消耗和处理压力
- PHP处理方式兼容性更好,适合老版本数据库,后续修改逻辑也更灵活
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

