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

Jea*_*ean 11 symfony doctrine-orm

您好我的Symfony2应用程序中有三个Doctrine2实体:两个("Promo"和"PromoPeriod")捆绑Acme:PromoBundle; Acme:ShopBundle捆绑中的一个("商店").关系是:Promo - PromoPeriod:多对一.PromoPeriod - 商店:一对多.

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

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

其中: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'.")
Run Code Online (Sandbox Code Playgroud)

因此,我认为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
Run Code Online (Sandbox Code Playgroud)

再也没有.也许这不是解决问题的方法.

任何的想法?

Adr*_*ult 23

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

SELECT p, pp, s
FROM AcmePromoBundle:Promo p
JOIN p.period pp
JOIN pp.shops s
Run Code Online (Sandbox Code Playgroud)

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

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