2016-11-14 87 views
1

如何实现bookshelfJs多的OrderBy()列bookshelfjs

我可以添加尽可能多的排序依据来模拟多个排序依据,但API可以有任何的排序选项 像example.com/users?sort=-name,status,它不需要被硬编码。

下面的答案似乎是合法的要求

Knex.js multiple orderBy() columns

如何实现在书架多个排序依据?

型号/ 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); 
     }); 
}; 

回答

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

得到urlquerystring

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

现在sortArray都排序字段,

现在使用你的问题(Knex.js multiple orderBy() columns)的添加答案来完成您的要求

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

未测试:

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); 
    }); 

新修改:

尝试一些事情摹这样,

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); 
    }); 

如果你得到了与解决承诺的任何问题,然后修改它喜欢,

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

锻造(...)。查询(...)。修改为不是功能 – atjoshi

+0

@atjoshi ...你有解决方案....? – Hemakumar

+0

是的..只需要追加knex查询作为函数,并为我们想要排序的whetever字段循环...查询(函数(qb){var i in sortArray){ qb.orderBy(sortArray [i] .field,sortArray [i] .direction); } })' – atjoshi