bookhelfjs中的多个orderBy()列

如何在书架上实现多个orderBy

我可以添加尽可能多的orderBy模型,但在API中可以有任何sorting选项,如example.com/users?sort=-name,status ,状态,它不需要硬编码。

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

Knex.js多个orderBy()列

如何在书架上实现多个orderBy?

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

url获取querystring

  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()列 )来完成您的需求

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

未testing:

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