javascript - bookshelf js 中的多个 order By() 列

标签 javascript node.js express bookshelf.js knex.js

如何在bookshelfJs中实现多个orderBy

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

下面的答案似乎符合要求

Knex.js multiple orderBy() columns

但是如何在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获取查询字符串

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

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

关于javascript - bookshelf js 中的多个 order By() 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40587536/

相关文章:

asp.net - 用于 ASP.NET 的 jQuery 图表控件

node.js - 在 node.js 中创建 S3 签名 URL

node.js - 请求未完成时开始查看网页

node.js - 单元测试快速路由调用 Controller 方法?

javascript - d3js 版本 3 到 4 用于切换条形图

javascript - 如何使框架中的实体旋转/旋转?

javascript - 为什么我的 :before class transition at all? polymer 没有

node.js - 从服务器获取当前用户信息的同时获取304状态代码

node.js - "Error: Cannot find module ' pkginfo '"- 部署到heroku的 Node js应用程序

javascript - 通过 Docker 问题快速安装