2016-11-14 10 views
1

Как реализовать несколько OrderBy в bookshelfJsMultiple OrderBy() колонка в bookshelfjs

Я могу добавить, как многие OrderBy модели, но в API могут быть любые параметры сортировки как example.com/users?sort=-name,status и это не должно быть жестко закодированы.

ответ ниже, кажется законным для требования

Knex.js multiple orderBy() columns

но Как реализовать несколько OrderBy в книжной полке?

модели/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); 
     }); 
}; 

ответ

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

получить querystring от 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); 
    }); 

Новых модифицированный:

Попробуйте что-нибудь г, как это,

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

Если у вас есть какие-либо проблемы с разрешением обещания, а затем изменить его нравится,

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

горн (...). запрос (...). изменить это не функция – atjoshi

+0

@atjoshi ... У вас есть решение ....? – Hemakumar

+0

Да .. просто нужно добавить запрос knex как функцию и цикл для полей whetever, которые мы хотим сортировать ... 'query (function (qb) { для (var i в sortArray) { qb.orderBy (sortArray [i] .field, sortArray [i] .direction) } }) ' – atjoshi