Symfony 5 QueryBuilder多表关联时如何正确统计主表CV的总数量
问题根源
多对多关联查询会产生笛卡尔积:单条CV主记录对应N条语言/文凭关联记录时,查询结果集会生成N行重复的CV记录,直接使用COUNT(p)统计会把这些重复行全部计入总数,导致统计结果偏大。
解决方法
仅需修改countSearch方法的统计逻辑,用COUNT(DISTINCT p.id)替代原有的COUNT(p)即可,无需改动已有的查询关联逻辑,完全复用getSearchQuery的筛选条件:
public function countSearch(SearchData $search) { return $this->getSearchQuery($search) ->select('COUNT(DISTINCT p.id)') ->getQuery() ->getSingleScalarResult(); }
逻辑说明
p.id是CV主表的主键,DISTINCT会自动对结果集中重复的CV主键去重,同一条CV无论关联多少条语言/文凭记录,只会被计数1次- 原有
leftJoin关联逻辑完全保留,用户按语言、文凭维度筛选的条件会正常生效,筛选后的统计结果和实际CV数量完全一致 - 如果你查询CV列表时也出现重复返回的问题,把
getSearchQuery中注释的select行打开即可解决列表重复问题
内容的提问来源于stack exchange,提问作者EvilSpartans
相关产品推荐
相关产品推荐

