php - querybuilder - left join doctrine
Symfony 2: INNER JOIN en una tabla no relacionada con el constructor de consultas de doctrina (4)
Hoy trabajé en una tarea similar y recordé que abrí este número. No sé desde qué versión de doctrina está funcionando, pero ahora puedes unirte fácilmente a las clases secundarias en el mapeo de herencia. Así que una consulta como esta funciona 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 fue 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 saben.
Estoy tratando de construir una consulta con el generador de consultas de doctrina 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 me sale un error:
Error: la variable de identificación TPost utilizada en la expresión de ruta de unión, pero no se definió anteriormente.
Busqué este mensaje de error y todos respondieron para usar el atributo alias + de la tabla como p.someAttribute. Pero la tabla a la que quiero unirme no está relacionada en la tabla desde la que comencé a seleccionar.
Como una consulta normal de mysql, la 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?
Las combinaciones entre entidades sin asociaciones no fueron posibles hasta la versión 2.4, donde puede generar una combinación arbitraria 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
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 rellenar sus objetos.
$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();