能否在该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)
如果你只需要第一条结果中的某一列数据,有两种实现方式:
- 调整查询语句只选择目标列,再用
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();
- 保留原查询,获取完整结果后提取目标列:
$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
相关产品推荐
相关产品推荐

