2016-11-14 2 views
1

Wie mehrere orderBy in bookshelfJs implementierenMultiple orderBy() Spalte in bookshelfjs

Ich kann so viele orderBy hinzufügen in API kann es eine Sortieroptionen wie example.com/users?sort=-name,status zu modellieren, aber sein, und es muss nicht hart codiert.

Die unten Antwort scheint für die Anforderung

Knex.js multiple orderBy() columns

aber legit Wie mehrere orderBy in Bücherregal zu implementieren?

models/Users.js

var Bookshelf = require('../../dbConfig').bookshelf; 

var User = Bookshelf.Model.extend({ 
    tableName: 'user_table' 
}); 
var Users = Bookshelf.Collection.extend({ 
    model: User 
}); 

module.exports = { 
    User: User, 
    Users: Users 
}; 

services.js

var Model = require('./../models/Users'); 
var express = require('express'); 

var listAllContentProviders = function (query_params, callback) { 
Model.Users 
     .forge() 
     .orderBy("name") 
     .orderBy("-status") 
     .fetch() 
     .then(function (collection) { 
      return callback(null, collection); 
     }) 
     .catch(function (err) { 
      return callback(err, null); 
     }); 
}; 

Antwort

0
var sortArray = []; 
var expectedSortFields = ["id", "status"]; // where we want the sorting remaining parameter will be ignored. 

for (var x in query_params) { 
     if (x === 'sort') { 
      var sortFields = query_params[x].split(','); 
      for (var y in sortFields) { 
       if (expectedSortFields.includes(sortFields[y])) { 
        sortArray[y] = { 
         'field': sortFields[y], 
         'direction': 'desc' //just made it desc for test, this can also be checked basedon the sign given in API '-' for desc and by default asc 
        } 
       } 
      } 
     } 

    } 

Model. Users 
     .forge() 
     .query(function (qb) { 
      for (var i in sortArray) { 
       qb.orderBy(sortArray[i].field, sortArray[i].direction); 
      } 
     }) 
     .then(function (collection) { 
      return callback(null, collection); 
     }) 
     .catch(function (err) { 
      return callback(err, null); 
     }); 
1

erhalten querystring von url,

var queryData = url.parse(request.url, true).query; 
    var sortArray = []; 
    if (queryData.sort) { 
     sortArray.push({field: queryData.sort , 'direction': 'asc'}; 
    } 

jetzt sortArray haben alle Sortierfelder,

nun die Antwort verwenden Sie in Frage hinzugefügt (Knex.js multiple orderBy() columns) Ihre Anforderung

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

Nicht getestet abzuschließen:

Model.Users 
    .forge() 
    .modify(function(queryBuilder) { 
     _.each(sortArray, function(sort) { 
      queryBuilder.orderBy(sort.field, sort.direction); 
     }) 
    }) 
    .fetch() 
    .then(function (collection) { 
     return callback(null, collection); 
    }) 
    .catch(function (err) { 
     return callback(err, null); 
    }); 

New Änderung:

Versuchen Sie etwas g wie diese,

queryBuilder = Model.Users 
    .forge() 
    .fetch(); 
    sortArray.forEach(function(sort) { 
     queryBuilder.orderBy(sort.field, sort.direction); 
    }); 
    queryBuilder.then(function (collection) { 
     return callback(null, collection); 
    }) 
    .catch(function (err) { 
     return callback(err, null); 
    }); 

Wenn Sie mit der Lösung verspricht jede Frage bekommen, dann ändern mögen,

queryBuilder = Model.Users 
    .forge(); 
    queryBuilder.then(function(){ 
     sortArray.forEach(function(sort) { 
      queryBuilder.orderBy(sort.field, sort.direction); 
     }) 
    }).fetch().then(function (collection) { 
     return callback(null, collection); 
    }) 
    .catch(function (err) { 
     return callback(err, null); 
    }); 
+0

Schmiede (...). Abfrage (...). modifizieren ist keine Funktion – atjoshi

+0

@atjoshi ... Hast du eine Lösung ....? – Hemakumar

+0

Ja .. muss nur die Knex-Abfrage als Funktion und Schleife für whottever Felder anfügen, die wir sortieren möchten ... 'query (function (qb) { für (var i in sortArray) { qb.orderBy (sortArray [i] .field, sortArray [i] .direction); } }) ' – atjoshi

Verwandte Themen