2012-04-18 26 views
8

Probablemente estoy pasando por alto algo muy simple y solo lo he estado mirando demasiado, pero no puedo hacer que esta consulta DQL funcione. Obtengo una excepción que dice:Doctrine query distinct entidad relacionada

Cannot select entity through identification variables without choosing at least one root entity alias. 

Aquí está mi consulta. El usuario tiene una relación de muchos a uno con el grupo. Tenga en cuenta que esta es una relación unidireccional! Eso puede no tener sentido para ti, pero tiene sentido en nuestra lógica de dominio.

SELECT DISTINCT g 
FROM Entity\User u 
LEFT JOIN u.group g 
WHERE u.active = :active 

¿Me puede decir lo que me falta aquí?

+0

¿No le falta un 'ENCENDIDO' aquí después de la UNIÓN IZQUIERDA? –

+3

No. Esto es Doctrine DQL, no SQL. –

Respuesta

5

trabajé todo el problema haciendo una subselección:

SELECT g 
FROM Entity\Group 
WHERE g.id IN (
    SELECT DISTINCT g2.id 
    FROM Entity\User u 
    LEFT JOIN u.group g2 
    WHERE u.active = :active 
) 
+0

Ah, eso tiene sentido. Parece recordar haber topado con eso una vez. Tipo de una solución molesta. –

6

Usted necesita seleccionar de la root entity alias .. lo que significa que no sólo se puede seleccionar de una tabla se está uniendo sucesivamente, como se puede en SQL normal .. por lo menos así debería hacerlo:

SELECT DISTINCT g 
FROM Entity\Group g 
INNER JOIN g.user u 
WHERE u.active = :active 
+0

Vaya, un error de transcripción de mi parte. Mis disculpas. Mis entidades reales tienen un nombre diferente, aunque su relación (y el resto del DQL) es la misma. –

+0

Ah, en ese caso, se queja de que usted consulta a los usuarios, pero no incluye la entidad de usuarios en la parte SELECCIONADA de su consulta, de ahí el 'al menos un alias de entidad raíz' en su advertencia - alias raíz de entidad solo significa * qué es en su cláusula FROM *, para todos los propósitos intensivos. He actualizado mi respuesta –

+0

Y ese es el problema exacto. Mi modelo de dominio dice que la relación es unidireccional, así que no puedo consultar desde el otro lado como lo haces aquí. Trabajé alrededor haciendo una subselección. –

15

Dado que este es el primer partido de Google cuando se busca el mensaje de error "no se puede seleccionar entidad a través de ...", decidí responder a pesar de que el tema se publicó hace unos meses.

El truco es usar JOIN ... WITH ... (como JOIN ... ON ... en SQL).

que estaba teniendo el mensaje con este código:

SELECT ro, COUNT(ro) 
FROM FH\MailerBundle\Entity\Recipient r 
JOIN r.selectedOption ro 
GROUP BY ro.id 

He resuelto el problema por este código:

SELECT ro, COUNT(ro) 
FROM FH\MailerBundle\Entity\RecipientOption AS ro 
JOIN FH\MailerBundle\Entity\Recipient AS r WITH r.selectedOption = ro 
GROUP BY ro.id 

que necesitaba para especificar los espacios de nombres completos y las clases para ambas entidades.

2

Esto se puede hacer usando DQL de nuevo CON palabra clave:

SELECT DISTINCT g 
FROM Entity\User u 
LEFT JOIN Entity\Group g 
WITH u in g.users 
WHERE u.active = :active 
1

tuve un problema similar y lo resolvió por múltiples a partir de las líneas de la siguiente manera:

$this->getDoctrine()->createQueryBuilder() 
    ->from('ProjectMainBundle:Group', 'g') 
    ->from('ProjectMainBundle:User', 'u') 
    ->select('distinct(g)') 
    ->where('u.group = g') 
    ->andWhere('u.active = :active') 
    ->.... 

Hennes

0

Yo uso este

$qb = $this->createQueryBuilder('o') 
      ->select('DISTINCT IDENTITY(o.user)') 
+0

No está consultando una entidad en un todo, sino solo su identidad. –

Cuestiones relacionadas