i具有续集的模型。我希望您可以将两个答复 to 录制,以及在帖子中作为答复的帖子。
从理论上讲,这只需要一个外键,一个"回复"字段,所以您有桌子:
----------------------
|id|post |replyId|
----------------------
|1 |post one |null |
|2 |replying |1 |
|3 |replying |1 |
----------------------
,要获取帖子回复1
,您会寻找1
的replyId
,
为了获得3
的帖子回复,您要查找1
的id
续集关系是:
Post.hasMany(models.Post, { as: 'Replies' })
Post.hasOne(models.Post, { as: 'ReplyingTo' })
然后将帖子添加到DB时:
//Having created `post`
post.setReplyingTo(replyingToPost)
//Having found `replyingToPost`
replyingToPost.addReplies(post)
但是无论我尝试什么,都有某种错误,例如在上表中,它是null
,您将获得ID 3
,并且续集不会返回ID 2
问题之所以发生,是因为您想在单个字段replyId
上持有两个关联(hasMany
和hasOne
)。我建议您仅使用单个关联,第二个关联可以通过instanceMethods
轻松实现。让我向您展示如何完成
Post.hasMany(models.Post, { as: 'Replies', foreignKey: 'replyId' });
它在字段replyId
上创建一个关联,因此我们现在可以轻松地获得/设置指定帖子的答复。现在,为了获得在单个帖子上设置ReplyingTo
的可能性,我们必须在Post
模型上添加两个实例方法。
instanceMethods: {
getReplyingTo: function(){
return this.sequelize.models.Post.findByPrimary(this.replyId);
},
setReplyingTo: function(replyingToPost){
return this.update({ replyId: replyingToPost.id });
}
}
所以,完整的示例可能就像那个
Post.create({ post: 'post content' }).then((post) => {
Post.create({ post: 'reply to previous' }).then((firstReply) => {
firstReply.setReplyingTo(post).then((self) => {
// now firstReply has replyId: 1
});
});
});
通过setReplyingTo
生成的查询将是
UPDATE "posts" SET "replyId" = 1 WHERE "id" = 2;
另一方面,我们还可以获取帖子给出的帖子回复
firstReply.getReplyingTo().then((replyingToPost) => {
// here we get the first created post
});
生成以下SQL
的生成SELECT "id", "post", "replyId" FROM "posts" AS "post" WHERE "post"."id" = 1;