【问题标题】:bookshelf.js count methodbookshelf.js 计数方法
【发布时间】:2014-02-19 18:16:34
【问题描述】:

我一直在寻找如何使用 Bookshelf.js 进行基本计数(如 SELECT COUNT(something) FROM table),但无济于事。有什么我想念的吗?还是仅与手动选择查询一起使用?

谢谢!

【问题讨论】:

    标签: node.js bookshelf.js


    【解决方案1】:
    //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);
    });
    

    在上面的代码中,sn-p User 是一个具有petname 等属性的模型。

    生成的查询如下:select count(*) from user where pet='dog';

    【讨论】:

      【解决方案2】:

      从 0.8.2 版开始,您可以只使用 Collection#count() 方法:

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

      这可以用于任何集合,例如模型的关系:

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

      它也可以作为静态方法用于模型类:

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

      它还接受列名,通过排除值为NULL 的行来过滤计数结果,并将考虑任何其他已定义的查询约束:

      User.count('is_active').then(function(count) {
        // count === 8
      })
      
      User.where('status', 'single').count().then(function(count) {
        // count === 4
      })
      

      【讨论】:

        【解决方案3】:

        这是一个非常简单的解决方案,只需使用 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')]});
        

        【讨论】:

          【解决方案4】:
          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");
          })
          

          【讨论】:

            【解决方案5】:

            这是我目前用于从模型中执行以下操作的格式:

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

            现在,要计算这张表,只需调用

            new Sample().count(function(err, result) {
                console.log(result)
            });
            

            【讨论】:

              【解决方案6】:

              现在是手动查询...例如:

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

              关于为什么会这样的故事由来已久,但这主要是因为关系计数方面的一些复杂性,我不想为了暂时把它放在那儿而在那儿破解一半的工作...最终的解决方案是:

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

              但目前这会改变 knex 查询构建器实例,因此不太有效。我一直致力于 knex 的大规模重构,我希望在不久的将来实现它。

              【讨论】:

              • 只是检查您是否在这方面取得了任何进展?
              • 是的,请查看下方的my answer
              猜你喜欢
              • 2014-03-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多