Доступ к вложенным отношениям в 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 уровней. Что мне нужно сделать с каждым комментарием, так это проверить таблицу с именем "voice", где "comment_id" - это идентификатор этого комментария, а "account_id" - это идентификатор учетной записи текущего req.user, и присоединить его к столбцу "poll_type" (который будет " вверх или вниз) за каждый комментарий. Любое понимание этой проблемы было бы здорово.

PS Что касается бонусных баллов, какие-либо рекомендации о том, как я могу заменить на Related: ['children.children.children.children'] и просто загрузить все дочерние комментарии, пока все они не будут загружены? Спасибо за ваше время:)

1 ответ

Решение

Таким образом, решением было вернуться к knex, собрать все мои комментарии по этой теме со всеми связанными данными, а затем построить дерево. Вот запрос, который я использовал Большое спасибо rhys-vdw в канале #bookshelf на irc.

                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)
Другие вопросы по тегам