Доступ к вложенным отношениям в 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)