我在 sequelize 中有一个模型要发布。我希望您可以检索对帖子的回复,以及作为回复的帖子。
理论上,这只需要一个外键,一个“replyId”字段,这样您就有了表格:
----------------------
|id|post |replyId|
----------------------
|1 |post one |null |
|2 |replying |1 |
|3 |replying |1 |
----------------------
因此,要获得回复 1
的帖子,您需要查找 1
的 replyId
,
要获得 3
回复的帖子,您需要查找 1
id
sequelize 关系是:
Post.hasMany(models.Post, { as: 'Replies' })
Post.hasOne(models.Post, { as: 'ReplyingTo' })
然后在将帖子添加到数据库时:
//Having created `post`
post.setReplyingTo(replyingToPost)
//Having found `replyingToPost`
replyingToPost.addReplies(post)
但无论我尝试什么,都存在某种错误,例如在上表中,它是 null
你得到 id 3
并且 sequelize 不返回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;
关于javascript - 如何在 Sequelize 模型上实现 'replyingTo' 和 'replies' 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42541077/