2012-06-18 2 views
11

Hallo Ich habe drei Doctrine2 Entitäten in meiner Symfony2-Anwendung: zwei ("Promo" und "PromoPeriod") im Bündel Acme: PromoBundle; ein ("Shop") im Bündel Acme: ShopBundle. Die Beziehungen sind: Promo - PromoPeriod: Many-to-One. PromoPeriod - Shop: Eins zu viele.Doctrine2 Query mit Auswahl auf mehreren Entitäten aus verschiedenen Symfony2 Bundles

Im Repository des Unternehmens „Promo“, versuche ich die ganze Promo und Geschäfte wie folgt zu erhalten:

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

wo: p.period die Beziehung zwischen der Promo Beispiel p und der PromoPeriod Periode ; pp.shops ist die Beziehung zwischen der PromoPeriod pp und den Shops. Der folgende Fehler zurückgegeben:

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

Also, ich argumentiert, dass Lehre nicht in der Lage ist, die Art von „s“ zu verstehen (die eine Shop-Einheit ist), wird, da es in einem anderen Bündel befindet. Daher habe ich versucht, eine Klausel INSTANCE OF hinzuzufügen:

Und wieder nichts. Vielleicht ist das nicht der Weg, um das Problem zu lösen.

Irgendeine Idee?

+0

Was ist, wenn Sie die FQCN benutzen? –

+0

Wie soll ich den FQCN verwenden? Denken Sie daran, dass in Doctrine2 SQL-Abfragen anders formuliert sind, da Doctrine2 ein ORM ist. – JeanValjean

+0

Mmm, mmm, FQCN = Vollständig qualifizierter Klassenname, die Art, wie Sie Entity auswählen, verwendet einen Doctrine2-Alias ​​(AcmePromoBundle). Der Alias ​​wird verwendet, um den Entitätsnamen während des Schreibens einer Abfrage zu verkürzen, er wird direkt dem tatsächlichen Namespace zugeordnet. Ich habe Sie gebeten, zu versuchen, das FQCN zu verwenden, um zu überprüfen, ob es ein Alias-Problem war. Die Auswahl von FQCN sollte in jedem Teil Ihrer Anwendung funktionieren. –

Antwort

23

Sie sollten die drei Einheiten wählen, wie so

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

Sie einen Join tun holen, das heißt: Lehre werden die Einheiten der Wurzel der Abfrage zurückgeben (hier Promo (n)) und hydratisieren Sie es mit den zusätzlichen Auswahleinheiten. Also, wenn Sie Lehre sagen, um die Geschäfte zu laden, die "kommen" aus der Zeit, aber nicht die Periode zu wählen ... er kann nicht tun, was Sie darum bitten. Hier ist die SQL-Abfrage in Ordnung, wenn die Doktrin Objekte zu hydratisieren versucht, löst sie eine Ausnahme aus.

Lesen Sie die dazugehörige Dokumentation http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#joins

+0

Nun, Sie haben recht, es wird kein Fehler zurückgegeben!Es werden jedoch nur die 'p' Objekte zurückgegeben, obwohl auch' pp' und 's' Objekte ausgewählt sind! Es scheint nicht normal zu sein! – JeanValjean

+1

aber pp und s sind jetzt durch p verfügbar – phonixor