You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:00:55