如何在续集模型上实现'replyingTo'和'replies'关联



i具有续集的模型。我希望您可以将两个答复 to 录制,以及在帖子中作为答复的帖子。

从理论上讲,这只需要一个外键,一个"回复"字段,所以您有桌子:

----------------------
|id|post     |replyId|
----------------------
|1 |post one |null   |
|2 |replying |1      |
|3 |replying |1      |
----------------------

,要获取帖子回复1,您会寻找1replyId
为了获得3的帖子回复,您要查找1id

续集关系是:

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上持有两个关联(hasManyhasOne)。我建议您仅使用单个关联,第二个关联可以通过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;

相关内容

  • 没有找到相关文章

最新更新