2012-02-27 17 views
9

Symfony framework presenta un archivo de aplicación/consola que se puede ejecutar a través de php para realizar algunas tareas de mantenimiento. También permite a los usuarios ejecutar consultas DQL:Doctrine no me permite seleccionar campos específicos

# php app/console doctrine:query:dql --hydrate=array \ 
    'SELECT u.id, u.nameFirst, u.nameLast FROM DatabaseBundle:User u' 
array 
    0 => 
    array 
     'id' => string '1' (length=1) 
     'nameFirst' => string 'jaroslav' (length=8) 
     'nameLast' => string 'rakhmatoullin' (length=13) 
    1 => 
    array 
     'id' => string '2' (length=1) 
     'nameFirst' => string 'Båb Kåre' (length=10) 
     'nameLast' => string 'Ytrefoss' (length=8) 

Observe que seleccioné tres columnas específicas. El problema que tengo es que una consulta similar me da un error cuando se unen dos tablas.

# php app/console doctrine:query:dql --hydrate=array \ 
    'SELECT u.id , r FROM DatabaseBundle:User u JOIN u.roles r' 

    [Doctrine\ORM\Query\QueryException]     
    [Semantical Error] line 0, col -1 near 'SELECT u.id ,': 
    Error: Cannot select entity through identification variables 
    without choosing at least one root entity alias. 

Las siguientes declaraciones de todo el usuario se unió a sus roles:

# php app/console doctrine:query:dql --hydrate=array \ 
    'SELECT u, r FROM DatabaseBundle:User u JOIN u.roles r' 

Obviamente, me falta algo.

¿Alguna idea? Apreciaría los enlaces a los documentos apropiados también (sobre este tema específico).

+1

No entiendo el mensaje de error muy bien, pero recuerdo que experimentan los mensajes de error similares, y la solución de mi problema seleccionando r.id, por lo que creo que debe tratar de seleccionar más campos. – greg0ire

+1

¿qué tal esto? ''SELECT u.id, r. * FROM DatabaseBundle: Usuario u JOIN u.roles r'' – jere

+1

greg0ire eso es correcto. Creo que no puede seleccionar un solo campo Y un objeto "entidad" en una consulta como esa. – jere

Respuesta

28

Desde el documentation on "Partial Object Syntax":

forma predeterminada cuando se ejecuta una consulta DQL en Doctrina y seleccionar sólo un subconjunto de los campos para una entidad dada, usted no recibe objetos de atrás. En cambio, solo recibe matrices como un conjunto de resultados rectangular plano, similar a cómo lo haría si solo estuviera usando SQL directamente y uniera algunos datos.

Si desea seleccionar objetos parciales, puede usar la palabra clave parcial DQL.

php console doctrine:query:dql --hydrate array \ 
    'SELECT partial s.{name ,id}, partial c.{name, id } 
    FROM DatabaseBundle:ProductCategories c 
    JOIN c.suppliers s ORDER BY s.name, c.name' 
+1

Tenga en cuenta que debe incluir la clave principal en una consulta parcial; de lo contrario, se obtiene un error desagradable. –

+2

Dos años después, no entiendo muy bien mi propia respuesta, pero si mal no recuerdo, la clave es que: cada categoría de producto se mapea como "c" y cada categoría.proveedor [] se mapea como s. Cada categoría tiene proveedores mapeados a través de una "@ anotación conjunta" en la clase ProductCategories. Gracias por todos los votos positivos. Creo que 10 es suficiente. –

+1

Pero, ¿y si realmente quieres recuperar el objeto completo? Me refiero, por ejemplo, a algunos campos de objetos A y luego a todo el objeto B? –

Cuestiones relacionadas