2012-06-18 20 views
11

Hola Tengo tres entidades Doctrine2 en mi aplicación Symfony2: dos ("Promo" y "PromoPeriod") en el paquete Acme: PromoBundle; uno ("Comprar") en el paquete Acme: ShopBundle. Las relaciones son: Promo - PromoPeriod: Many-to-One. PromoPeriod - Shop: One-to-Many.Consulta de Doctrine2 con select en varias entidades de diferentes paquetes Symfony2

En el repositorio de la "Promo" entidad, trato de obtener toda la promo y las tiendas de la siguiente manera:

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

donde: p.period es la relación entre la instancia de Promoción py el período PromoPeriod ; pp.shops es la relación entre el PromoPeriod pp y las Tiendas. se devuelve el siguiente error:

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

Así, argumenté que la doctrina no es capaz de entender el tipo de "s" (que es una entidad Shop), ya que se encuentra en otro paquete. Por lo tanto, intenté agregar una cláusula INSTANCE OF:

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

Y de nuevo nada. Quizás esta no sea la forma de resolver el problema.

¿Alguna idea?

+0

Lo que si se utiliza el FQCN? –

+0

¿Cómo debo usar el FQCN? Recuerde que en Doctrine2 las consultas SQL están formuladas de una manera diferente, ya que Doctrine2 es un ORM. – JeanValjean

+0

Mmm, mmm, FQCN = Nombre de clase totalmente calificado, la forma en que selecciona Entidad es usar un alias de Doctrine2 (el AcmePromoBundle). El alias se usa para atajar el nombre de la Entidad al escribir una consulta, se asigna directamente al espacio de nombres real. Te pedí que intentaras usar el FQCN para verificar si era un problema de aliasing. Seleccionar FQCN debería funcionar en cualquier parte de su aplicación. –

Respuesta

23

hay que seleccionar las 3 entidades, al igual que

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

Estás haciendo una zona de alcance se unen, es decir: la doctrina devolverá las entidades de la raíz de la consulta (en este caso de Promoción (s)), y hidratarlo con las entidades de selección adicionales. Entonces, si le dices a doctrine que cargue las tiendas, que "venga" del período, pero que no seleccione el período ... no puede hacer lo que le pides que haga. Aquí, la consulta SQL va bien, es cuando la doctrina trata de hidratar los objetos que arroja una excepción.

lea la documentación referente http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#joins

+0

¡Bien, tienes razón, no se devuelve ningún error!Sin embargo, solo se devuelven los objetos 'p', a pesar de que también se seleccionan los objetos' pp' y 's'. ¡No parece ser normal! – JeanValjean

+1

pero los pp y s están ahora disponibles a través de p – phonixor

Cuestiones relacionadas