你好我的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
再一次没事。也许这不是解决问题的方法。
有什么想法吗?
答案 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