Doctrine查询关联失败求助:语法错误提示预期标识符
问题排查与修复
嘿,我一眼就揪出问题所在啦!你遇到的这个毫无头绪的语法错误,根源其实特别简单——你用了SQL的保留关键字作为关联表的别名。
错误原因分析
你在查询里把assessments关联的别名设成了as:
$qb->innerJoin('ca.assessments', 'as');
但AS是SQL里的保留关键字(用来定义别名的关键字本身),Doctrine的DQL解析器会把它当成语法的一部分,而不是你自定义的别名,所以才会抛出这个奇怪的错误:
debug: [Syntax Error] line 0, col -1: Error: Expected Doctrine\ORM\Query\Lexer::T_IDENTIFIER, got end of string.
修复方案
只需要把别名换成一个非SQL关键字的名称就行,比如ass、a都可以:
$qb = $this->entityManager->createQueryBuilder(); $qb->select('ca') ->from(Candidate::class, 'ca') ->innerJoin('ca.assessments', 'ass'); // 替换成合法的别名
额外的小优化提示
看你的实体关联定义,Candidate实体的OneToMany上写了@ORM\JoinColumn(nullable=false),其实这个注解是多余的——因为OneToMany属于关联的Inverse Side(反向端),JoinColumn应该只定义在**Owning Side(拥有端)**也就是Assessment的ManyToOne上,你已经在Assessment里正确配置了,所以可以把Candidate里的这个注解删掉,避免混淆。
内容的提问来源于stack exchange,提问作者Luke Pring
相关产品推荐
相关产品推荐

