Necesito ordenar los datos por dos columnas (cuando las filas tienen diferentes valores para la columna número 1, ordene por ella; de lo contrario, ordene por la columna número 2)
Estoy usando QueryBuilder
para crear la consulta.
Si llamo al orderBy
método por segunda vez, reemplaza cualquier orden especificado previamente.
Puedo pasar dos columnas como primer parámetro:
->orderBy('r.firstColumn, r.secondColumn', 'DESC');
Pero no puedo pasar dos direcciones de orden para el segundo parámetro, por lo que cuando ejecuto esta consulta, la primera columna se ordena en dirección ascendente y la segunda, descendente. Me gustaría usar descendente para ambos.
¿Hay alguna forma de hacer esto usando QueryBuilder
? ¿Necesito usar DQL?
fuente
alias.column_name
.En Doctrine 2.x no puedes pasar varios pedidos usando la doctrina 'orderBy' o 'addOrderBy' como en los ejemplos anteriores. Porque agrega automáticamente el 'ASC' al final del nombre de la última 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')
, SQL generará algo como esto 'ORDER BY first_name ASC, last_name ASC ASC'. Así que este es un error de sintaxis SQL. Simplemente porque el valor predeterminado de orderBy o addOrderBy es 'ASC'.Para agregar varios pedidos, debe usar la función 'agregar'. Y será así.
->add('orderBy','first_name ASC, last_name ASC')
. Esto le dará el SQL con el formato correcto.Más información sobre la función add (). https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api
Espero que esto ayude. ¡Salud!
fuente
puedes usar
->addOrderBy($sort, $order)
Agregar: Doctrine Querybuilder por cierto. utiliza a menudo modificaciones "especiales" de los métodos normales, ver
select-addSelect
,where-andWhere-orWhere
,groupBy-addgroupBy
...fuente
El comentario de
orderBy
notas de código fuente:Keys are field and values are the order, being either ASC or DESC.
. Entonces puedes hacerloorderBy->(['field' => Criteria::ASC])
.fuente
El
orderBy
método requiere dos cadenas o unExpr\OrderBy
objeto. Si desea agregar varias declaraciones de pedido, lo correcto es usar eladdOrderBy
método o crear una instancia de unOrderBy
objeto y completarlo en consecuencia:fuente