访问Bookshelf.js中的嵌套关​​系

时间:2015-09-12 15:51:21

标签: node.js bookshelf.js

我想你可以说我正在构建一个reddit风格的应用程序。所以我有一个主题,该主题有评论,这些评论有父评论等。这是我的评论模型:

var Comment = bookshelf.Model.extend({

  tableName: 'comments',

  topic: function() {
    return this.belongsTo(Topic, 'topic_id');
  },

  children: function() {
    return this.hasMany(Comment, 'parent_id')
  }

});

所以在我的.get('/ topic')页面中,我加载了这样的评论:

new Comment()
  .query({where: {topic_id: topic_id}})
  .query({where: {parent_id: null}})
  .fetchAll({
    withRelated: ['children.children.children.children']
  })

所以这对我来说是取得所有顶级评论,并将所有儿童评论最多嵌入4级。我需要对每个评论做的是检查一个名为'votes'的表,其中'comment_id'是评论的id,其中'account_id'是当前req.user的帐户ID,并从'vote_type'列附加(这将是'每个评论都有'或''')。对这个问题的任何见解都会很棒。

P.S。对于奖励积分,我可以替换相关的任何建议:['children.children.children.children']并加载所有子评论,直到它们全部被加载?谢谢你的时间:))

1 个答案:

答案 0 :(得分:3)

所以解决方案是回退到knex,用所有相关数据获取我对该主题的所有评论,然后构建一个树。这是我最后使用的查询。非常感谢irc的#bookshelf频道中的rhys-vdw。

                knex('comments').leftOuterJoin('votes', function() {
                    this.on('comments.id', 'votes.comment_id')
                        .andOn(knex.raw('votes.account_uuid = ?', req.user.uuid));
                })
                .leftOuterJoin('vote_count', function() {
                    this.on('comments.id', 'vote_count.comment_id');
                })
                .select('comments.*', 'votes.vote_type', 'vote_count.upvotes', 'vote_count.downvotes')
                .where('comments.topic_id', '=', topic_id)