书架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);
});
如何在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);
});