Bookshelf JS 关系 - 计数

Bookshelf JS Relation - Getting Count

我正在尝试获取属于特定公司的用户数。

这是我的模型;

var Company = Bookshelf.Model.extend({
    tableName: 'companies',
    users: function () {
        return this.hasMany(User.Model, "company_id");
    },
    users_count : function(){
        return new User.Model().query(function(qb){
            qb.where("company_id",9);
            qb.count();
        }).fetch();
    },
    organization: function () {
        return this.belongsTo(Organization.Model, "organization_id");
    }
});

在路线中,我使用的是这样的书架模型;

new Company.Model({id:req.params.id})
            .fetch({withRelated:['users']})
            .then(function(model){
                res.send(model.toJSON())
            })
            .catch(function(error){
                res.send(error);
            });

我应该如何使用 users_count 方法,我有点困惑(可能是因为承诺)

集合#count()

如果升级到 0.8.2,您可以使用新的 Collection#count method

Company.forge({id: req.params.id}).users().count().then(userCount =>
  res.send('company has ' + userCount + ' users!');
);

你的例子有问题

您的 users_count 方法的问题在于它试图让 Bookshelf 将您的查询结果转换为模型。

users_count : function(){
  return new User.Model().query(function(qb){
      qb.where("company_id",9);
      qb.count();
  }).fetch(); // Fetch wanted an array of `user` records.
},

这应该适用于这种情况。

users_count : function(){
  return new User.Model().query()
    .where("company_id",9)
    .count()
},

参见相关讨论here

编辑:如何在你的属性中得到这个。

也许可以试试这样:

knex = bookshelf.knex;

var Company = bookshelf.Model.extend({
    tableName: 'companies',
    initialize: function() {
      this.on('fetching', function(model, attributes, options) {
        var userCountWrapped = knex.raw(this.getUsersCountQuery()).wrap('(', ') as user_count');
        options.query.select('*', userCountWrapped);
      }
    }
    users: function () {
        return this.hasMany(User.Model, "company_id");
    },
    getUsersCountQuery: function() {
      return User.Model.query()
        .where("company_id",9)
        .count();
    }
    organization: function () {
        return this.belongsTo(Organization.Model, "organization_id");
    }
});
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");
})

查看 bookshelf-eloquent 扩展。 withCount() 函数可能就是您正在寻找的。您的代码看起来像这样:

let company = await Company.where('id', req.params.id)
    .withCount('users').first();