11

您好,我的 Symfony2 应用程序中有三个 Doctrine2 实体:包 Acme:PromoBundle 中有两个(“Promo”和“PromoPeriod”);Acme:ShopBundle 包中的一个(“Shop”)。这些关系是: Promo - PromoPeriod: Many-to-One。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

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

任何想法?

4

1 回答 1

23

您应该选择 3 个实体,如下所示

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

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

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

于 2012-07-06T00:36:32.087 回答