可正常运行的MySQL查询转Doctrine DQL后执行错误如何解决
问题修正方案
首先请确认你的App\Entity\Ame实体已经正确配置了和TypeAme、Profile的关联映射,类似如下注解配置:
// Ame实体中关联字段配置 /** * @ORM\ManyToOne(targetEntity: TypeAme::class) * @ORM\JoinColumn(name="type_ame_id", referencedColumnName="id", nullable=false) */ private $typeAme; /** * @ORM\ManyToOne(targetEntity: Profile::class) * @ORM\JoinColumn(name="profile_id", referencedColumnName="id") */ private $profile;
原DQL的错误点
- JOIN语法错误:DQL的关联查询需要基于主实体的关联属性,不能直接关联目标实体类,你未指定关联条件,导致Doctrine无法解析两张表的关联关系
- 硬编码查询参数:方法传入了
$user参数但没有使用,直接写死a.profile=2不符合复用规则,也存在注入风险 - 聚合字段解析风险:COUNT和GROUP BY直接作用于关联实体对象,部分低版本Doctrine可能出现解析异常
修改后的正确代码
如果你需要复用传入的$user参数,推荐使用参数绑定写法:
public function findStatistique($user) { $entityManager = $this->getEntityManager(); $query = $entityManager->createQuery( 'SELECT a.dateAjout, COUNT(ta.id) as countType, ta.nom FROM App\Entity\Ame a LEFT JOIN a.typeAme ta WHERE a.profile = :user GROUP BY a.dateAjout, ta.id ORDER BY a.dateAjout ASC' )->setParameter('user', $user); return $query->getResult(); }
如果你确实需要硬编码profile_id为2,不需要复用$user参数,也可以写为:
public function findStatistique() { $entityManager = $this->getEntityManager(); $query = $entityManager->createQuery( 'SELECT a.dateAjout, COUNT(ta.id) as countType, ta.nom FROM App\Entity\Ame a LEFT JOIN a.typeAme ta WHERE a.profile = 2 GROUP BY a.dateAjout, ta.id ORDER BY a.dateAjout ASC' ); return $query->getResult(); }
内容的提问来源于stack exchange,提问作者Audry Babela
相关产品推荐
相关产品推荐

