Javascript 如何在Bookshelf.js模型上添加count方法?

Javascript 如何在Bookshelf.js模型上添加count方法?,javascript,bookshelf.js,knex.js,Javascript,Bookshelf.js,Knex.js,我有以下表格: 书籍 书评 用户 以下是与上述表格相对应的模型: 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

我有以下表格:

  • 书籍
  • 书评
  • 用户
以下是与上述表格相对应的模型:

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] } ] }
我想为每个用户添加一个方法,该方法是从上面的输出返回的评论中返回的,其中包含了他们所有评论的计数

我试图在
用户
模型中添加类似的内容,但我不能完全正确地完成

numReviews: function(userId) {
        return new BookReview.query(function(qb){
            qb.where("user_id",userId);
            qb.count();
        }).fetch();
  },

如果要将该方法添加到
用户
模型的每个实例中,则可以覆盖
构造函数
函数,如下所示

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())之后
您可以使用length参数访问书籍的评论计数

console.log(book.reviews.length);

因为is是书评的
数组
,在
JSON
中表示为
[…]

,所以我想要每个用户每本书拥有的书的总数。这只会告诉我藏书的数量。@bob_cobb,我不明白“每个用户每本书拥有多少本书”