【问题标题】:Doctrine2 query with select on multiple entities from different Symfony2 bundles对来自不同 Symfony2 包的多个实体进行选择的 Doctrine2 查询
【发布时间】:2012-06-18 11:56:18
【问题描述】:

您好,我的 Symfony2 应用程序中有三个 Doctrine2 实体:Acme:PromoBundle 包中有两个(“Promo”和“PromoPeriod”); Acme:ShopBundle 包中的一个(“Shop”)。 关系是: 促销 - 促销期:多对一。 PromoPeriod - 商店:一对多

在实体“促销”的存储库中,我尝试获取所有促销和商店,如下所示:

    return $this->getEntityManager()
        ->createQuery("SELECT p, s
            FROM AcmePromoBundle:Promo p JOIN p.period pp JOIN pp.shops s")
            ->getResult();

其中:p.period是Promo实例p与PromoPeriod周期的关系; pp.shops 是 PromoPeriod pp 和 Shops 之间的关系。 返回以下错误:

An exception has been thrown during the rendering of a template 
("The parent object of entity result with alias 's' was not found. 
The parent alias is 'pp'.")

因此,我认为 Doctrine 无法理解“s”的类型(这是一个 Shop 实体),因为它位于另一个捆绑包中。因此我尝试添加一个 INSTANCE OF 子句:

SELECT p, s
FROM AcmePromoBundle:Promo p JOIN p.period pp JOIN pp.shops s
WHERE s INSTANCE OF AcmeShopBundle:Shop

又没有。也许这不是解决问题的方法。

有什么想法吗?

【问题讨论】:

  • 我应该如何使用FQCN?请记住,在 Doctrine2 中,SQL 查询是以不同的方式制定的,因为 Doctrine2 是一个 ORM。
  • Mmm, mmm, FQCN = 完全限定的类名,您选择实体的方式是使用 Doctrine2 别名(AcmePromoBundle)。别名用于在编写查询时简化实体名称,它直接映射到实际的命名空间。我请您尝试使用 FQCN 来检查是否是混叠问题。选择 FQCN 应该适用于您的应用程序的任何部分。
  • 关键是我不明白该怎么做!请举个例子。
  • 不要使用AcmePromoBundle:Promo,而是使用Acme\PromoBundle\Promo
  • 它不起作用。返回以下错误:Error: Class 'Acme\PromoBundle\Promo' is not defined.")

标签: symfony doctrine-orm


【解决方案1】:

你应该选择 3 个实体,像这样

SELECT p, pp, s
FROM AcmePromoBundle:Promo p
JOIN p.period pp
JOIN pp.shops s

您正在执行 fetch 连接,即:学说将返回查询根的实体(此处为 Promo(s)),并将其与其他选择实体结合起来。 因此,如果您告诉学说加载商店,即“来自”时期,但不选择时期......他不能做你要求它做的事情。 在这里,SQL 查询运行良好,当学说尝试水合对象时,它会引发异常。

阅读相关文档http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#joins

【讨论】:

  • 嗯,你是对的,没有返回错误!但是,仅返回 p 对象,尽管还选择了 pps 对象!好像不太正常!
  • 但是 pp 和 s 现在可以通过 p 获得
猜你喜欢
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多