【发布时间】:2020-06-30 18:19:02
【问题描述】:
我对 Doctrine ORM 还是很陌生,我正在尝试使用教义转换原始 SQL 查询以获取实体数组。
基本上,我想获得更多course 用户间接注册的实体之一。 course id 位于 traineeship 表中。 traineeship id 和 user id 在 registration 表中。
这是我的 SQL 查询:
SELECT * FROM course c
LEFT JOIN traineeship t
ON c.id = t.courseId
LEFT JOIN registration r
ON t.id = r.traineeshipId
WHERE r.userId = 2681;
这就是我试图用教义做的事情:
return $this->createQueryBuilder('c')
->andWhere('t.course = c')
->leftJoin('c.traineeships', 't')
->andWhere('r.traineeship = t')
->leftJoin('t.registrations', 'r')
->andWhere('r.id = :user')
->setParameter('user', $user)
->getQuery()
->execute();
使用我的原始 SQL 查询,我得到两个具有给定 ID 的预期结果。通过学说生成的查询,我只得到一个结果。所以我猜我的教义使用不好。
(教义关系:
课程OneToMany培训
培训OneToMany注册
注册ManyToOne用户)
【问题讨论】:
-
$user是否包含用户 ID 或用户实体? -
关于左连接你不需要添加
->andWhere('t.course = c')和->andWhere('r.traineeship = t')。应在您的实体中定义关系(请参阅doctrine-project.org/projects/doctrine-orm/en/2.7/reference/…) -
请查看doctrine-project.org/projects/doctrine-orm/en/2.7/reference/… 获取有关如何使用 ORM QueryBuilder 执行查询的文档
-
你在哪里打电话给
$this->createQueryBuilder?它在实体存储库中吗? -
@W0rma 抱歉回答迟了。 1. $user 包含实体,但我使用 $user->getId() 得到完全相同的结果。当我认为它与 wole 实体一起工作时,我将其保留(框架/ orm 魔法)。 2. 哦,有趣,谢谢你的提示。我删除了那些行。 3. 是的,我会(再次)阅读文档并尝试找到如何使用 Doctrine。 4. 是的,querybuilder 是从 courseRepository 的自定义方法中调用的。感谢您的回答。
标签: php sql symfony orm doctrine