web-dev-qa-db-ja.com

Knex.jsの複数のorderBy()列

複数のorderBy()列を実行することは可能ですか?

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

チェーン可能なorderBy()は単一の列キーとソート値のみを受け取りますが、どのようにして複数の列で順序付けできますか?

17
Ian Jones

call .orderBy複数回 複数の列で並べ替えるには:

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

元の答えは技術的に正しく、有用ですが、私の意図は、プログラムで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()を複数回呼び出します。

16
Ian Jones

次の解決策を使用して問題を解決できます。

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

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