2012-06-18 9 views
11

Witam Mam trzy obiekty Doctrine2 w mojej aplikacji Symfony2: dwie ("Promo" i "PromoPeriod") w pakiecie Acme: PromoBundle; jeden ("Shop") w pakiecie Acme: ShopBundle. Relacje są następujące: Promo - PromoPeriod: Wiele-do-jednego. PromoPeriod - Sklep: Jeden-do-wielu.Prośba Doctrine2 z wybieraniem wielu podmiotów z różnych pakietów Symfony2

w repozytorium podmiotu „Promo”, staram się uzyskać wszystkie promo i sklepów, co następuje:

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

gdzie: p.period jest zależność między instancji Promo p i okresu PromoPeriod ; pp.shops to relacja między PromoPeriod pp i sklepami. następujący błąd jest zwracany:

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'.") 

Tak, twierdził, że nauka nie jest w stanie zrozumieć typ „S” (który jest jednostką Shop), ponieważ znajduje się w innym pakiecie. W związku z tym próbowałem dodać klauzulę INSTANCJI:

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

I znowu nic. Być może nie jest to sposób na rozwiązanie problemu.

Każdy pomysł?

+0

Co jeśli używasz FQCN? –

+0

Jak korzystać z FQCN? Pamiętaj, że w Doctrine2 zapytanie SQL jest sformułowane w inny sposób, ponieważ Doctrine2 jest ORM. – JeanValjean

+0

Mmm, mmm, FQCN = W pełni kwalifikowana nazwa klasy, sposób w jaki wybierasz Podmiot używa aliasu Doctrine2 (AcmePromoBundle). Alias ​​jest używany do skrótu nazwy jednostki podczas pisania zapytania, jest bezpośrednio odwzorowany na rzeczywisty obszar nazw. Poprosiłem cię, abyś spróbował użyć FQCN, aby sprawdzić, czy to był problem z aliasingiem. Wybór FQCN powinien działać w dowolnej części aplikacji. –

Odpowiedz

23

Należy zaznaczyć 3 podmioty, tak jak

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

robisz sprowadzić przyłączenia, tj: doktryna powróci podmioty z korzenia zapytania (tu Promo (y)), oraz nawodnić go dodatkowymi wybranymi jednostkami. Więc jeśli powiesz doktrynie, żeby załadowała sklepy, że "przyjdą" z okresu, ale żeby nie wybrać okresu ... nie może zrobić tego, o co prosisz. W tym przypadku zapytanie SQL przebiega poprawnie, kiedy doktryna próbuje nawodnić obiekty, które zgłasza wyjątek.

zapoznać się z odpowiednią dokumentacją http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#joins

+0

Cóż, masz rację, żaden błąd nie jest zwracany!Jednak zwracane są tylko obiekty 'p', mimo że wybrane są również obiekty' pp' i 's'! To nie wydaje się normalne! – JeanValjean

+1

, ale pp i s są teraz dostępne przez p – phonixor

Powiązane problemy