Doctrine joined表继承场景下QueryBuilder访问父类关联属性报错问询
问题解答
现有代码报错原因
你写的查询代码不会生效,报错逻辑如下:
Doctrine的DQL解析规则里,不会自动隐式完成关联对象的join操作。你写的c.user.id会被DQL直接解析为「Child实体中名为user的字段下的id子属性」,但Child继承的user是独立的关联对象属性,本身不存在id子字段的映射,因此直接抛出字段不存在的错误。
不需要手动join的正确写法
如果你不想额外加join操作,可以直接使用Doctrine提供的IDENTITY()函数直接读取关联字段的外键值,不需要关联User表即可完成查询:
$qb = $this->createQueryBuilder('c'); return $qb ->select('count(c.id)') ->where('IDENTITY(c.user) = :userid') ->setParameter('userid', $userId) ->getQuery() ->getSingleScalarResult();
IDENTITY(c.user)会直接读取Person表中id_user外键列的值,和你直接查id_user字段的效率完全一致。
额外新增$id_user字段是不是最佳实践?
不是最佳实践。
关联映射下Doctrine已经自动维护了id_user外键列,你额外新增字段的话需要自行维护该字段和$user关联属性的同步逻辑,反而容易出现数据不一致的问题,完全没有必要。
内容的提问来源于stack exchange,提问作者Krannsock
相关产品推荐
相关产品推荐

