如何在 Bookshelf.js 模型上添加计数方法?
How to add count method on Bookshelf.js model?
我有以下表格:
books
book_reviews
users
以下是与上述表格对应的模型:
const BookReview = require('./BookReview').model;
const User = require('./User').model;
module.exports.model = bookshelf.Model.extend({
tableName: 'books',
user: function() {
return this.hasOne(User, 'user_id');
},
reviews: function() {
return this.hasMany(BookReview);
}
});
module.exports.model = bookshelf.Model.extend({
tableName: 'book_reviews',
user: function() {
// Prevent circular dependency.
const User = require('./User').model;
return this.belongsTo(User, 'user_id');
},
});
module.exports.model = bookshelf.Model.extend({
tableName: 'users',
reviews: function() {
return this.belongsToMany(BookReview, 'user_id');
}
});
我正在查找一本书并尝试获取它拥有的所有评论(并且所有撰写这些评论的用户都附加到返回的评论),它目前正在使用以下语句:
return Book.forge({
id: req.params.id,
type: req.params.type
}).fetch({withRelated: ['reviews', 'reviews.user'], require: true}).then(function(book) {
console.log(book.toJSON());
return book;
}).catch(function(err) {
throw new Error(err.message);
});
};
上面 book.toJSON()
的输出如下所示:
上面 book.toJSON() 的输出:
{ id: 1,
type: 'novel',
slug: 'catcher-in-the-rye',
user_id: 1,
name: 'Catcher in the Rye',
created_at: Tue Oct 04 2016 22:35:42 GMT-0700 (PDT),
updated_at: Tue Oct 04 2016 22:35:42 GMT-0700 (PDT),
reviews:
[ { id: 14,
user_id: 2,
book_id: 1,
rating: 3,
review: 'Test',
created_at: Wed Oct 05 2016 20:47:34 GMT-0700 (PDT),
updated_at: Wed Oct 05 2016 20:47:34 GMT-0700 (PDT),
user: [Object] } ] }
我想为上面输出的评论中返回的每个用户添加一个方法,该方法计算了他们所有的总评论。
我试图将类似的东西添加到 User
模型中,但我无法完全正确地完成它。
numReviews: function(userId) {
return new BookReview.query(function(qb){
qb.where("user_id",userId);
qb.count();
}).fetch();
},
如果您想将方法添加到 User
模型的每个实例,那么您可以像下面这样覆盖 constructor
函数
var User=bookshelf.Model.extend({
tableName: 'users',
constructor:function(){
bookshelf.Model.apply(this, arguments);
this.numReviews=function(){
var thisUser=this;
return new BookReview.query(function(qb){
qb.where("user_id",thisUser.attributes.userId);
qb.count();
}).fetch();
}
}
});
但我认为这些方法效果不佳,所以也许您应该尝试其他选择。不幸的是,我没有那么多地使用书架库,所以我真的没有任何关于更高效的方法来完成任务的建议。
总之,希望对你有所帮助。
在你的行之后console.log(book.toJSON());
您可以使用长度参数访问图书的评论数。
console.log(book.reviews.length);
因为是 array
的书评,在 JSON
中表示为 [...]
我有以下表格:
books
book_reviews
users
以下是与上述表格对应的模型:
const BookReview = require('./BookReview').model;
const User = require('./User').model;
module.exports.model = bookshelf.Model.extend({
tableName: 'books',
user: function() {
return this.hasOne(User, 'user_id');
},
reviews: function() {
return this.hasMany(BookReview);
}
});
module.exports.model = bookshelf.Model.extend({
tableName: 'book_reviews',
user: function() {
// Prevent circular dependency.
const User = require('./User').model;
return this.belongsTo(User, 'user_id');
},
});
module.exports.model = bookshelf.Model.extend({
tableName: 'users',
reviews: function() {
return this.belongsToMany(BookReview, 'user_id');
}
});
我正在查找一本书并尝试获取它拥有的所有评论(并且所有撰写这些评论的用户都附加到返回的评论),它目前正在使用以下语句:
return Book.forge({
id: req.params.id,
type: req.params.type
}).fetch({withRelated: ['reviews', 'reviews.user'], require: true}).then(function(book) {
console.log(book.toJSON());
return book;
}).catch(function(err) {
throw new Error(err.message);
});
};
上面 book.toJSON()
的输出如下所示:
上面 book.toJSON() 的输出:
{ id: 1,
type: 'novel',
slug: 'catcher-in-the-rye',
user_id: 1,
name: 'Catcher in the Rye',
created_at: Tue Oct 04 2016 22:35:42 GMT-0700 (PDT),
updated_at: Tue Oct 04 2016 22:35:42 GMT-0700 (PDT),
reviews:
[ { id: 14,
user_id: 2,
book_id: 1,
rating: 3,
review: 'Test',
created_at: Wed Oct 05 2016 20:47:34 GMT-0700 (PDT),
updated_at: Wed Oct 05 2016 20:47:34 GMT-0700 (PDT),
user: [Object] } ] }
我想为上面输出的评论中返回的每个用户添加一个方法,该方法计算了他们所有的总评论。
我试图将类似的东西添加到 User
模型中,但我无法完全正确地完成它。
numReviews: function(userId) {
return new BookReview.query(function(qb){
qb.where("user_id",userId);
qb.count();
}).fetch();
},
如果您想将方法添加到 User
模型的每个实例,那么您可以像下面这样覆盖 constructor
函数
var User=bookshelf.Model.extend({
tableName: 'users',
constructor:function(){
bookshelf.Model.apply(this, arguments);
this.numReviews=function(){
var thisUser=this;
return new BookReview.query(function(qb){
qb.where("user_id",thisUser.attributes.userId);
qb.count();
}).fetch();
}
}
});
但我认为这些方法效果不佳,所以也许您应该尝试其他选择。不幸的是,我没有那么多地使用书架库,所以我真的没有任何关于更高效的方法来完成任务的建议。
总之,希望对你有所帮助。
在你的行之后console.log(book.toJSON());
您可以使用长度参数访问图书的评论数。
console.log(book.reviews.length);
因为是 array
的书评,在 JSON
中表示为 [...]