书架js中的多个order By()列

Multiple orderBy() column in bookshelfjs

如何在bookshelfJs中实现多个orderBy

我可以向模型中添加尽可能多的 orderBy 但在 API 中可以有任何排序选项 像 example.com/users?sort=-name,status 并且不需要硬编码。

下面的答案似乎符合要求

但是如何在Bookshelf中实现多个orderBy?

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

url

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

现在 sortArray 有所有排序字段,

现在使用您在问题中添加的答案 () 来完成您的要求

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

New modified:

尝试这样的事情,

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

如果您在解决 promise 时遇到任何问题,请修改它,

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