Doctrine2查询,选择来自不同Symfony2包的多个实体

时间:2012-06-18 11:56:19

标签: symfony doctrine-orm

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

在实体“Promo”的存储库中,我尝试按以下方式获取所有促销和商店:

    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和商店之间的关系。 返回以下错误:

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

再一次没事。也许这不是解决问题的方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:23)

您应该选择3个实体,如此

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

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

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