bookshelf.js count method

后端 未结 6 820
星月不相逢
星月不相逢 2021-02-14 01:20

I was searching high and low to find how to do basic counting (like SELECT COUNT(something) FROM table) with Bookshelf.js, but to no avail. Is there anything I\'m missing? Or is

相关标签:
6条回答
  • 2021-02-14 01:42

    For now it's a manual query... e.g:

    bookshelf.knex(tableName).count('columnName').then(...
    

    Long story as to why that's the case, but it's mainly because of a few complexities around counts in relations, I don't want to hack a half working one on there just for the sake of having it there for the time being... the ultimate solution is going to be to have:

    model.query().count(column).then(...
    

    But currently that mutates the knex query builder instance, so doesn't quite work. I've been working on a big refactor of knex and I'm looking to get this implemented in the near future.

    0 讨论(0)
  • 2021-02-14 01:45
    User.collection().query(function (qb) {
      qb.join('courses', 'users.id', 'courses.user_id');
      qb.groupBy('users.id');
      qb.select("users.*");
      qb.count('* as course_count');
      qb.orderBy("course_count", "desc");
    })
    
    0 讨论(0)
  • 2021-02-14 01:53
    //user.js
    var db = require('./db');
    var User = db.Model.extend({  
      tableName: 'users',
      hasTimestamps: true,
    });
    module.exports = User; 
    
    //main.js
    var User = require('./user');
    User.where('pet', 'dog').count('*').then(function(count) {
      console.log("Total Count : " , count);
    });
    

    In the above code snippet User is a model having the attributes like pet and name.

    The generated query will be as follows: select count(*) from user where pet='dog';

    0 讨论(0)
  • 2021-02-14 01:55

    Here's the format that I'm currently using to do the following from a model:

    var Sample = bookshelf.Model.extend({
      tableName: 'example',
    
      count: function (cb) {
        bookshelf.knex('example')
          .count('id')
          .then(function (count) {
            cb(null, count)
          })
          .catch(function (err) {
            cb(err)
          })
      }
    })
    

    Now, to count this table, simply call

    new Sample().count(function(err, result) {
        console.log(result)
    });
    
    0 讨论(0)
  • 2021-02-14 02:01

    Here is a really simple solution just use Bookshelf.knex.raw('count(id) as count')

    ReactionsDb
        .query(function(qb) {
          qb.groupBy('reaction_type');
        })
        .fetchAll({columns: ['reaction_type', Bookshelf.knex.raw('count(id) as count')]});
    
    0 讨论(0)
  • 2021-02-14 02:03

    Since version 0.8.2 you can just use the Collection#count() method:

    User.collection().count().then(function(count) {
      // count === 15
    })
    

    This can be used on any collection, like a model's relation:

    User.forge({id: 1}).related('comments').count().then(function(count) {
      // count === 16
    })
    

    It can also be used on Model classes as a static method:

    User.count().then(function(count) {
      // count === 15
    })
    

    It also accepts a column name to filter the results of the count by excluding rows whose value is NULL and will take into consideration any other defined query constraints:

    User.count('is_active').then(function(count) {
      // count === 8
    })
    
    User.where('status', 'single').count().then(function(count) {
      // count === 4
    })
    
    0 讨论(0)
提交回复
热议问题