2012-06-20 139 views
17

Estoy intentando crear una consulta con el generador de consultas doctrina que se une a una tabla no relacionada como esto:Symfony 2: INNER JOIN en la tabla no relacionada con el generador de consultas doctrina

$query = $this->createQueryBuilder('gpr') 
     ->select('gpr, p') 
     ->innerJoin('TPost', 'p') 
     ->where('gpr.contentId = p.contentId') 

pero esto no significa trabajo. Todavía consigo un error:

Error: Identification Variable TPost used in join path expression but was not defined before.

Busqué este mensaje de error y todo el mundo respondieron a utilizar los alias de mesa + atribuir como p.someAttribute. Pero la tabla a la que quiero unirme no está relacionada en la tabla desde la que comienzo mi selección.

como una consulta MySQL normal, lo escribiría así:

SELECT * FROM t_group_publication_rel gpr 
INNER JOIN t_post p 
WHERE gpr.content_id = p.content_id 

Alguna idea de lo que estoy haciendo mal?

+0

Podemos utilizar DQL para llevar a cabo unirme con objetos no relacionados? No lo sé. Si es posible, es interesante =). – sensorario

+2

¿Por qué no solo compila * una relación entre estos dos, si desea unirse a ellos? –

+0

En este caso, una relación no sería suficiente. Necesitaría relaciones con 3 tablas diferentes y cualquier registro solo podría establecer una referencia a 1 de estos 3. –

Respuesta

51

Hoy estaba trabajando en una tarea similar y recordé que abrí este problema. No sé desde qué versión de la doctrina funciona, pero ahora puede unirse fácilmente a las clases secundarias en el mapeo de herencia. Por lo que una consulta como esta está funcionando sin ningún problema:

$query = $this->createQueryBuilder('c') 
     ->select('c') 
     ->leftJoin('MyBundleName:ChildOne', 'co', 'WITH', 'co.id = c.id') 
     ->leftJoin('MyBundleName:ChildTwo', 'ct', 'WITH', 'ct.id = c.id') 
     ->orderBy('c.createdAt', 'DESC') 
     ->where('co.group = :group OR ct.group = :group') 
     ->setParameter('group', $group) 
     ->setMaxResults(20); 

que iniciar la consulta en mi clase padre que está utilizando el mapeo de herencia. En mi publicación anterior era un punto de partida diferente, pero el mismo problema si recuerdo bien.

Debido a que fue un gran problema cuando comencé este problema, creo que también podría ser interesante para otras personas que no lo conocen.

+0

¡Gracias! Esto realmente ayudó, he estado buscando por horas. – Assil

+0

si no tengo el repositorio 'MyBundleName: ChildTwo', quiero escribir la consulta con el nombre de la tabla, ¿cuál es la solución? –

+0

@MohammadFareed La referencia a la entidad no es un repositorio, es una cadena en el formato ': ' O el FQCN de la clase de entidad, p. \ AppBundle \ Entity \ ChildTwo :: class –

0

Una unión DQL solo funciona si se define una asociación en su asignación. En su caso, diría que es mucho más fácil hacer una consulta nativa y usar ResultSetMapping para poblar sus objetos.

2
$dql = "SELECT 
    a, md.fisrtName , md.LastName, mj 
    FROM MembersBundle:Memberdata md 
     INNER JOIN MembersBundle:Address a WITH md = a.empID 
     INNER JOIN MembersBundle:Memberjob mj WITH md = mj.memberData 
      ... 
    WHERE 
     a.dateOfChange IS NULL 
    AND WHERE 
     md.someField = 'SomeValue'"; 

return $em->createQuery($dql)->getResult(); 
+1

Si bien esta respuesta no proporciona los detalles requeridos, no hay nada que citar ya que la documentación de Doctrine carece por completo de cobertura de este tipo de uniones. Esto funcionó para mí. Sé suficiente sql para analizar lo que se pretendía y no hay suficiente doctrina para conectar los puntos. – eggmatters

3

uniones entre entidades sin asociaciones no eran posibles hasta la versión 2.4, donde se puede generar una arbitraria se unen con la siguiente sintaxis:

$query = $em->createQuery('SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email'); 

Referencia: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

+0

¡Esto es asombroso!Tenga en cuenta que la cláusula 'WITH' es necesaria en este caso, de lo contrario, da como resultado un error de sintaxis. Sin embargo, puede usar una condición ficticia y obtener una combinación cruzada real, que DQL no admite. Por ejemplo: 'SELECT u FROM User u JOIN Items i WITH 0 = 0'. Esto puede ser útil para estadísticas complejas. – jlh