如何用Symfony QueryBuilder对JSON数组中的priceDF值求和?
解决Symfony QueryBuilder对JSON数组内字段求和的问题
你的问题出在JSON_EXTRACT返回的是JSON数组(比如[150,250]),直接转DECIMAL会被解析为0,导致SUM结果为0。要对JSON数组里的字段求和,必须先把数组拆成独立的行,再对每行的数值求和。
正确实现代码(适用于MySQL 8.0.4+/MariaDB 10.5+)
利用MySQL的JSON_TABLE函数将JSON数组展开为虚拟表,再对字段求和:
$qb = $this->createQueryBuilder('s'); $qb->select("SUM(CAST(jt.priceDF AS DECIMAL(10,2))) as totalPriceDF") ->join('s.valid', 'v') ->from('JSON_TABLE( v.dac, "$.bdc.service.operator.entries[*]" COLUMNS( priceDF DECIMAL(10,2) PATH "$.priceDF" ) )', 'jt'); $resultCP = $qb->getQuery()->getResult();
关键说明
JSON_TABLE会把entries数组中的每个对象拆成虚拟表jt的一行,同时提取指定路径的priceDF字段- 代码中已按你的实际需求替换为
priceDF,如果需要求和priceWT,调整PATH路径即可 - 确保你的数据库版本支持
JSON_TABLE,老版本数据库无法使用该函数
老版本数据库替代方案
如果数据库不支持JSON_TABLE,只能先查询出所有关联的Valid实体,在PHP层面循环解析JSON并求和:
$qb = $this->createQueryBuilder('s') ->select('v.dac') ->join('s.valid', 'v'); $dacList = $qb->getQuery()->getArrayResult(); $total = 0; foreach ($dacList as $item) { $entries = $item['dac']['bdc']['service']['operator']['entries'] ?? []; foreach ($entries as $entry) { $total += $entry['priceDF'] ?? 0; } }
这种方式性能较差,数据量大时不推荐。
内容的提问来源于stack exchange,提问作者Laura Leroy
相关产品推荐
相关产品推荐

