您好,我的 Symfony2 应用程序中有三个 Doctrine2 实体:捆绑 Acme:PromoBundle 中的两个(“Promo”和“PromoPeriod”); Acme:ShopBundle 包中的一个(“Shop”)。
关系是:
促销 - 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 和 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
又什么都没有。也许这不是解决问题的方法。
任何的想法?
最佳答案
您应该像这样选择 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
关于symfony - Doctrine2 查询,从不同的 Symfony2 包中选择多个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11082305/