如何在Bookshelf.js模型上添加计数方法?

3
我有以下表格:
  • 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();
  },
2个回答

3

如果您想要将该方法添加到每个 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();
    }
  }
});

但是我认为这些方法表现不佳,所以也许你应该尝试另一种选择。不幸的是,我并没有太多使用书架库的经验,所以对于更高效地完成任务的建议并没有什么帮助。

无论如何,希望这能对你有所帮助。


1
在您输入console.log(book.toJSON());之后,您可以使用length参数访问书籍评论的数量。
console.log(book.reviews.length);

因为它是一组书评,用 JSON 表示为 [...]数组

我想要每个用户拥有的书籍总数,对于每一本书都要统计。这只会给我收藏中书籍的数量。 - bob_cobb
@bob_cobb,我不理解“每个用户拥有的每本书的数量计数”。 - tnt-rox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接