QueryBuilder查询去重关联实体报Invalid PathExpression错误咨询
错误原因
该报错是Doctrine ORM的DQL解析规则导致的:
- 你直接在
select中写a.supplierUser时,supplierUser是JobItemQuote的关联实体属性,不属于普通映射字段(也就是报错中提到的StateFieldPathExpression) - 没有显式关联该属性的前提下,DQL解析器无法判断你是要取关联的外键值,还是要返回完整的关联实体对象,就会抛出路径表达式非法的错误。你之前添加关联但仍然报错,是因为没有修改
select部分的内容指向关联后的别名。
解决方法
根据你的需求,有两种可行的写法:
方案1:直接返回去重并完成水化的SupplierUser实体列表
如果你需要拿到完整的SupplierUser实体对象,显式join关联后select关联别名即可:
$qb = $this->createQueryBuilder('a') ->distinct(true) ->join('a.supplierUser', 'su') ->select('su'); $result = $qb->getQuery()->getResult();
该写法返回的$result就是去重后的SupplierUser实体数组,完全满足结果水化的需求。
方案2:仅获取去重的supplierUser ID列表
如果你只需要和原生SQL一致的ID数组,可以用Doctrine提供的IDENTITY函数直接取关联字段的外键值,不需要额外join:
$qb = $this->createQueryBuilder('a') ->select('DISTINCT IDENTITY(a.supplierUser) as supplierUserId'); $result = $qb->getQuery()->getSingleColumnResult();
返回的$result就是一维的ID数组,和原生SQL执行结果完全一致。
内容的提问来源于stack exchange,提问作者Bankzilla
相关产品推荐
相关产品推荐

