2012-06-18 65 views
11

您好,我在Symfony2應用程序中有三個Doctrine2實體:兩個(「Promo」和「PromoPeriod」)包中的Acme:PromoBundle;一個(「商店」)在捆綁Acme:ShopBundle。 關係如下: 促銷 - 促銷期:多對一。 PromoPeriod - Shop:一對多Doctrine2查詢選擇來自不同Symfony2包的多個實體

在實體「促銷」的資料庫,我試圖讓所有的促銷和商店如下:

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

其中:p.period是推廣實例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'.") 

所以,我認爲,原則是不能夠理解的「S」(這是一個店鋪的實體)的類型,因爲它位於另一個包。因此,我試圖添加一個INSTANCE OF子句:

SELECT p, s 
FROM AcmePromoBundle:Promo p JOIN p.period pp JOIN pp.shops s 
WHERE s INSTANCE OF AcmeShopBundle:Shop 

再次沒有。也許這不是解決問題的方法。

有什麼想法?

+0

如果你使用什麼FQCN? –

+0

我應該如何使用FQCN?請記住,在Doctrine2中,SQL查詢是以不同的方式制定的,因爲Doctrine2是一個ORM。 – JeanValjean

+0

Mmm,mmm,FQCN =完全限定類名稱,您選擇Entity使用Doctrine2別名(AcmePromoBundle)的方式。別名用於在寫入查詢時快捷實體名稱,它直接映射到實際的名稱空間。我要求您嘗試使用FQCN來檢查它是否是別名問題。選擇FQCN應該可以在你的應用程序的任何部分工作。 –

回答

23

你應該選擇3個實體,像這樣

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

你正在做一個fetch連接,即:原則將返回查詢(此促銷(S))的根實體,以及用額外的選擇實體對其進行水合。 所以,如果你告訴學說載入商店,那是從期間「來」,但不要選擇期間......他不能做你要求它做的事情。 在這裏,SQL查詢很好,它是當教條試圖水合它引發異常的對象時。

閱讀相關文檔http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#joins

+0

嗯,你是對的,沒有錯誤返回!然而,只有'p'對象被返回,儘管也選擇了'pp'和's'對象!這似乎不正常! – JeanValjean

+1

但pp和s現在可通過p – phonixor

相關問題