【问题标题】:Transpose a raw SQL query with doctrine使用学说转置原始 SQL 查询
【发布时间】: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


【解决方案1】:

从原始 SQL 中,我希望得到以下查询:

return $this->createQueryBuilder('c')
    ->leftJoin('c.traineeships', 't')
    ->leftJoin('t.registrations', 'r')
    ->andWhere('r.user = :user')
    ->setParameter('user', $user)
    ->getQuery()
    ->getResult();

请注意,我使用的是->andWhere('r.user = :user') 而不是->andWhere('r.id = :user'),因为我假设registration.id 拥有注册的ID,而不是用户的ID。在我的查询中,我还假设registration 有一个属性user,它包含对用户的引用。

查询应该返回一个课程实体数组。

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 2019-02-03
    • 2015-01-31
    • 2015-11-21
    相关资源
    最近更新 更多