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");
}
});
- 方法"users"效果很好,没问题。
- 方法 "users_count" 查询效果很好,但无法为 "company" 模型获取价值。
在路线中,我使用的是这样的书架模型;
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();
我正在尝试获取属于特定公司的用户数。
这是我的模型;
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");
}
});
- 方法"users"效果很好,没问题。
- 方法 "users_count" 查询效果很好,但无法为 "company" 模型获取价值。
在路线中,我使用的是这样的书架模型;
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();