Preciso ordenar os dados por duas colunas (quando as linhas têm valores diferentes para a coluna número 1, ordenar por ela; caso contrário, ordenar pela coluna número 2)
Estou usando um QueryBuilder
para criar a consulta.
Se eu chamar o orderBy
método uma segunda vez, ele substituirá todas as ordens especificadas anteriormente.
Posso passar duas colunas como o primeiro parâmetro:
->orderBy('r.firstColumn, r.secondColumn', 'DESC');
Mas não posso passar duas direções de ordenação para o segundo parâmetro, portanto, quando executo esta consulta, a primeira coluna é ordenada em uma direção crescente e a segunda, em ordem decrescente. Eu gostaria de usar a descida para os dois.
Existe uma maneira de fazer isso usando QueryBuilder
? Eu preciso usar DQL?
fonte
alias.column_name
.No Doctrine 2.x você não pode passar pedidos múltiplos usando a doutrina 'orderBy' ou 'addOrderBy' como os exemplos acima. Porque, ele adiciona automaticamente o 'ASC' no final do nome da última coluna quando você deixou o segundo parâmetro em branco, como na função 'orderBy'.
Para um exemplo
->orderBy('a.fist_name ASC, a.last_name ASC')
, o SQL irá gerar algo como 'ORDER BY first_name ASC, last_name ASC ASC'. Portanto, este é um erro de sintaxe SQL. Simplesmente porque o padrão de orderBy ou addOrderBy é 'ASC'.Para adicionar vários pedidos por, você precisa usar a função 'adicionar'. E vai ser assim.
->add('orderBy','first_name ASC, last_name ASC')
. Isso lhe dará o SQL formatado corretamente.Mais informações sobre a função add (). https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api
Espero que isto ajude. Felicidades!
fonte
você pode usar
->addOrderBy($sort, $order)
Adicionar: Doctrine Querybuilder btw. muitas vezes usa modificações "especiais" dos métodos normais, veja
select-addSelect
,where-andWhere-orWhere
,groupBy-addgroupBy
...fonte
O comentário de
orderBy
notas de código fonte:Keys are field and values are the order, being either ASC or DESC.
. Então você pode fazerorderBy->(['field' => Criteria::ASC])
.fonte
O
orderBy
método requer duas strings ou umExpr\OrderBy
objeto. Se você deseja adicionar várias declarações de pedido, o correto é usar oaddOrderBy
método ou instanciar umOrderBy
objeto e preenchê-lo de acordo:fonte