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

能否在该QueryBuilder中使用getSingleColumnResult?获取首个元素是否有问题

问题分析与解决方案

你的QueryBuilder代码中使用getSingleColumnResult()存在明确问题,原因如下:

  • 你的查询语句同时选择了三个列:dossier.codeDossier、nb_actif和nb_inactif,但getSingleColumnResult()的设计初衷是处理仅返回单列数据的查询。当前每个结果行包含多列值,调用该方法会直接抛出异常(如NonUniqueResultException),因为它无法处理多列的结果集。

根据你"获取查询结果首个元素"的需求,分两种场景给出正确的实现方式:

场景1:需要首个完整结果行(包含全部三列数据)

如果你想获取第一条结果的所有字段值,应该使用getOneOrNullResult()方法。它会返回第一条结果的关联数组(或实体对象),若没有结果则返回null,适合结果集可能为空或有多条结果的情况:

return $this->createQueryBuilder('a')
  ->select('dossier.codeDossier, SUM(a.actif) nb_actif, SUM(a.inactif) nb_inactif')
  ->join('a.dossier', 'dossier')
  ->join('dossier.contrat', 'contrat')
  ->groupBy('dossier.id')
  ->having('nb_actif = 0')
  ->andHaving('nb_inactif > 0')
  ->andWhere('contrat.actif = 1')
  ->getQuery()
  ->getOneOrNullResult();

如果你能确保查询结果恰好只有一条,也可以使用getSingleResult(),但该方法在结果为空或多于一条时会抛出异常,需谨慎使用。

场景2:仅需要首个结果的某一列值(比如仅codeDossier)

如果你只需要第一条结果中的某一列数据,有两种实现方式:

  1. 调整查询语句只选择目标列,再用getSingleScalarResult()获取单个值:
return $this->createQueryBuilder('a')
  ->select('dossier.codeDossier')
  ->join('a.dossier', 'dossier')
  ->join('dossier.contrat', 'contrat')
  ->groupBy('dossier.id')
  ->having('SUM(a.actif) = 0')
  ->andHaving('SUM(a.inactif) > 0')
  ->andWhere('contrat.actif = 1')
  ->getQuery()
  ->getSingleScalarResult();
  1. 保留原查询,获取完整结果后提取目标列:
$result = $this->createQueryBuilder('a')
  ->select('dossier.codeDossier, SUM(a.actif) nb_actif, SUM(a.inactif) nb_inactif')
  ->join('a.dossier', 'dossier')
  ->join('dossier.contrat', 'contrat')
  ->groupBy('dossier.id')
  ->having('nb_actif = 0')
  ->andHaving('nb_inactif > 0')
  ->andWhere('contrat.actif = 1')
  ->getQuery()
  ->getOneOrNullResult();

return $result ? $result['codeDossier'] : null;

内容的提问来源于stack exchange,提问作者Mathis Royer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:23:15