2016-04-01 14 views
7

È possibile eseguire più colonne orderBy()?Knex.js multiple orderBy() colonne

knex 
    .select() 
    .table('products') 
    .orderBy('id', 'asc') 

L'orderBy() chainable solo richiede una chiave unica colonna e un valore di ordinamento, ma come posso ordinare a più colonne?

+1

Non sono sicuro che ci sia una funzione speciale per questo, ma puoi fare un 'orderByRaw' e scrivere quello che ti serve –

+0

@VsevolodGoloviznin Speravo di non doverlo fare, ma è la mia ultima risorsa. –

risposta

16

È possibile call .orderBy multiple times ordinare da più colonne:

knex 
    .select() 
    .table('products') 
    .orderBy('name', 'desc') 
    .orderBy('id', 'asc') 
+1

Grazie, ma esiste un modo per applicarlo in modo programmatico? per un numero sconosciuto di ordini dai campi? –

+1

Basta scorrere l'elenco delle colonne e chiamare 'orderBy' per ognuna. Salverò il JS di base come esercizio per te :) – Kevin

6

La risposta originale è tecnicamente corretta, e utile, ma la mia intenzione era quella di trovare un modo per applicare programatically le più volte orderBy() funzione, qui è la soluzione reale sono andato con riferimento:

var sortArray = [ 
    {'field': 'title', 'direction': 'asc'}, 
    {'field': 'id', 'direction': 'desc'} 
]; 

knex 
    .select() 
    .table('products') 
    .modify(function(queryBuilder) { 
    _.each(sortArray, function(sort) { 
     queryBuilder.orderBy(sort.field, sort.direction); 
    }); 
    }) 

Knex offre una funzione di modifica che consente QueryBuilder da operare direttamente. Un iteratore di array chiama quindi orderBy() più volte.

+0

Penso che la risposta originale funzionasse come volevi. Ad esempio: let query = knex .select() .table ('prodotti'); _.each (sortArray, function (sort) { query.orderBy (sort.field, sort.direction); }); – nembleton