Symfony 2: INNER JOIN en una tabla no relacionada con el generador de consultas de doctrine

Intento crear una consulta con el generador de consultas de doctrine que se une a una tabla no relacionada como esta:

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

Pero esto no funciona. Todavía recibo un error:

Error: la variable de identificación TPost utilizada en la expresión de ruta de combinación, pero no se definió anteriormente.

Busqué este mensaje de error y todos respondieron que usaban el atributo de tabla alias + 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 normal de MySQL, 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?

Hoy estaba trabajando en una tarea similar y recordé que abrí este tema. No sé desde qué versión de la doctrine funciona, pero ahora puede unirse fácilmente a las clases secundarias en el mapeo de herencia. Entonces, 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); 

Comienzo la consulta en mi clase principal que está utilizando la asignación 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.

Las uniones entre entidades sin asociaciones no fueron posibles hasta la versión 2.4, donde puede generar una combinación arbitraria con la siguiente syntax:

 $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

 $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(); 

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