2012-07-20 34 views
81

I necesidad de ordenar los datos por dos columnas (cuando las filas tienen valores diferentes para el número de la columna 1, el orden por ella, de lo contrario, el orden de número de columna 2)Orden por varias columnas con la doctrina

estoy usando una QueryBuilder para crear la consulta.

Si llamo al método orderBy una segunda vez, reemplaza cualquier ordenamiento previamente especificado.

puedo pasar dos columnas como el primer parámetro:

->orderBy('r.firstColumn, r.secondColumn', 'DESC'); 

Pero no puedo pasar dos direcciones de pedidos para el segundo parámetro, así que cuando ejecuto esta consulta la primera columna se ordena en una dirección ascendente y el el segundo, descendiendo Me gustaría usar descendente para ambos.

¿Hay alguna manera de hacerlo usando QueryBuilder? ¿Necesito usar DQL?

Respuesta

161

hay que añadir la dirección orden correcto después de que el nombre de la columna:

$qb->orderBy('column1 ASC, column2 DESC'); 

Como se ha señalado, varias llamadas a orderBydo not stack, pero se pueden hacer varias llamadas a addOrderBy:

$qb->addOrderBy('column1', 'ASC') 
    ->addOrderBy('column2', 'DESC'); 
+0

gracias. No me di cuenta de esto antes. Pensé que dos declaraciones de OrderBy están bien para esto. así que no me di cuenta del método addOrderBy. aplausos por señalarlo :) – Sharpy35

5

puede usar ->addOrderBy($sort, $order)

Agregar: Doctrine Querybuilder btw. utiliza a menudo modificaciones "especiales" de los métodos normales, consulte select-addSelect, where-andWhere-orWhere, groupBy-addgroupBy ...

11

En Doctrina 2.x no se puede pasar el fin múltiple mediante el uso de la doctrina 'orderBy' o 'addOrderBy' como ejemplos anteriores. Porque, automáticamente agrega el 'ASC' al final del último nombre de columna cuando dejó el segundo parámetro en blanco, como en la función 'orderBy'.

Por ejemplo, ->orderBy('a.fist_name ASC, a.last_name ASC') generará SQL algo así como 'ORDER BY first_name ASC, last_name ASC ASC'. Entonces este es un error de sintaxis SQL. Simplemente porque el valor predeterminado de orderBy o addOrderBy es 'ASC'.

Para agregar varios pedidos por, necesita usar la función 'agregar'. Y será así.

->add('orderBy','first_name ASC, last_name ASC'). Esto le dará el SQL con formato correcto.

Más información sobre la función de agregar(). http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.QueryBuilder.html#_add

Espero que esto ayude. ¡Aclamaciones!