【发布时间】:2014-02-19 18:16:34
【问题描述】:
我一直在寻找如何使用 Bookshelf.js 进行基本计数(如 SELECT COUNT(something) FROM table),但无济于事。有什么我想念的吗?还是仅与手动选择查询一起使用?
谢谢!
【问题讨论】:
标签: node.js bookshelf.js
我一直在寻找如何使用 Bookshelf.js 进行基本计数(如 SELECT COUNT(something) FROM table),但无济于事。有什么我想念的吗?还是仅与手动选择查询一起使用?
谢谢!
【问题讨论】:
标签: node.js bookshelf.js
//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 是一个具有pet 和name 等属性的模型。
生成的查询如下:select count(*) from user where pet='dog';
【讨论】:
从 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
})
【讨论】:
这是一个非常简单的解决方案,只需使用 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')]});
【讨论】:
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");
})
【讨论】:
这是我目前用于从模型中执行以下操作的格式:
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)
});
【讨论】:
现在是手动查询...例如:
bookshelf.knex(tableName).count('columnName').then(...
关于为什么会这样的故事由来已久,但这主要是因为关系计数方面的一些复杂性,我不想为了暂时把它放在那儿而在那儿破解一半的工作...最终的解决方案是:
model.query().count(column).then(...
但目前这会改变 knex 查询构建器实例,因此不太有效。我一直致力于 knex 的大规模重构,我希望在不久的将来实现它。
【讨论】: