Doctrine ORM关联查询列表与统计结果不一致解决方案咨询
问题1:让getList()返回全部9条记录(保留重复数据)
Doctrine 内置的对象水化器默认会按实体主键去重,同一个工作单元(UnitOfWork)中相同 ID 的实体会被合并为同一个实例,所以才会出现原生SQL返回9行、ORM查询仅返回5个对象的情况。
修改方案可选两种:
- 若不需要返回实体对象,仅需要原始行数据,直接把
getResult()改为getArrayResult()即可,会原样返回所有查询到的行数据,不会合并重复实体。 - 若必须返回实体对象,可在执行查询前添加强制部分加载的提示,关闭实体合并逻辑:
// 在getQuery()之后调用setHint $result = $qb->getQuery() ->setHint(\Doctrine\ORM\Query::HINT_FORCE_PARTIAL_LOAD, true) ->getResult();
注意:开启强制部分加载后,返回的实体不会被纳入UnitOfWork管理,后续不能直接通过这个实体做更新操作。
问题2:调整getCount()返回去重后的总条数5
当前的count逻辑统计的是join关联后的所有行数,只要改成统计去重的主表ID即可,修改select部分:
// 把原来的select('count(a.id)')替换为 $qb = $this->createQueryBuilder('a')->select('count(DISTINCT a.id)');
修改后会自动统计满足条件的不重复的film表记录数,和getList()默认返回的去重后实体数量完全一致。
内容的提问来源于stack exchange,提问作者bars
相关产品推荐
相关产品推荐

