Knex.js多个orderBy()列

时间:2016-04-01 10:22:09

标签: node.js knex.js

是否可以执行多个orderBy()列?

knex
  .select()
  .table('products')
  .orderBy('id', 'asc')

orderBy()chainable只需要一个列键和一个排序值,但我如何按多列排序?

4 个答案:

答案 0 :(得分:24)

您可以call .orderBy multiple times按多列排序:

knex
  .select()
  .table('products')
  .orderBy('name', 'desc')
  .orderBy('id', 'asc')

答案 1 :(得分:14)

原始答案在技术上是正确的,也很有用,但我的目的是找到一种以编程方式多次应用orderBy()函数的方法,这是我参考的实际解决方案:

var sortArray = [
  {'field': 'title', 'direction': 'asc'}, 
  {'field': 'id', 'direction': 'desc'}
];

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

Knex提供了一个修改功能,允许直接操作queryBuilder。然后,数组迭代器会多次调用orderBy()

答案 2 :(得分:3)

Knex orderBy函数还接收一个数组:

knex('users').orderBy(['email', 'age', 'name'])

knex('users').orderBy(['email', { column: 'age', order: 'desc' }])

knex('users').orderBy([{ column: 'email' }, { column: 'age', order: 'desc' }])

答案 3 :(得分:2)

您可以使用以下解决方案来解决您的问题:

const builder = knex.table('products');

sortArray.forEach(
  ({ field, direction }) => builder.orderBy(field, direction)
);