Doctrine ORM查询报错:期望T_INSTANCE却得到'.'的问题求助
解决Doctrine QueryBuilder中isInstanceOf关联属性的语法错误
问题原因
你遇到的语法错误是因为Doctrine的isInstanceOf表达式不支持带点的关联属性路径(比如ftch.stat),它只能接受查询根实体的别名,或者已经通过join操作指定了别名的关联实体。
解决方案
需要先将关联的stat属性join到查询中并指定别名,再在isInstanceOf中使用这个别名。同时修复鉴别器注解里的语法小问题。
1. 修正鉴别器注解
原注解末尾多了一个多余的*,会导致注解解析异常,先修正:
/** * @ORM\DiscriminatorMap({ * "a" = "A", * "b" = "B" * }) */ abstract class Stat implements JsonSerializable { // ... 类内容 }
2. 修改仓库查询方法
在QueryBuilder中先joinstat关联并指定别名,再使用该别名进行isInstanceOf判断:
public function findWithFilter(array $params): array { $qb = $this->createQueryBuilder('ftch'); // 先join关联的stat属性,指定别名s $qb->join('ftch.stat', 's'); if (isset($params['networkType']) && count($params['networkType']) > 0) { $orX = $qb->expr()->orX(); foreach ($params['networkType'] as $networkType) { if ($networkType === NetworkType::A->value) { // 使用别名s替代ftch.stat $orX->add($qb->expr()->isInstanceOf('s', 'App\Entity\A')); } elseif ($networkType === NetworkType::B->value) { $orX->add($qb->expr()->isInstanceOf('s', 'App\Entity\B')); } } $qb->andWhere($orX); } return $qb->getQuery()->getResult(); }
关键说明
- 必须通过
join操作将关联实体引入查询上下文,才能给它分配别名并用于isInstanceOf判断 isInstanceOf的第一个参数必须是查询中已存在的实体别名,不能是关联路径表达式
内容的提问来源于stack exchange,提问作者jeremie legrand
相关产品推荐
相关产品推荐

