javascript - 如何在 Sequelize 模型上实现 'replyingTo' 和 'replies' 关联

标签 javascript sql node.js sequelize.js model-associations

我在 sequelize 中有一个模型要发布。我希望您可以检索帖子的回复,以及作为回复的帖子。

理论上,这只需要一个外键,一个“replyId”字段,这样您就有了表格:

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

因此,要获得回复 1 的帖子,您需要查找 1replyId
要获得 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 上持有两个关联(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;

关于javascript - 如何在 Sequelize 模型上实现 'replyingTo' 和 'replies' 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42541077/

相关文章:

javascript - 为什么 document.execCommand ('paste' ) 在我的扩展中不起作用

javascript - jQuery:是 element.click(func) 还是 element.attr ('onclick' ,'func()' ) 更有效?

mysql - 执行插入/删除批处理 spring-jdbc/mysql 的最佳方法

mysql 检查用户是否有超过 x 个事务或来自不同表的超过 x 的评级,并使用 where OR

python - SQL 链接到 Access 数据库错误

javascript - 如何销毁 Croppie jQuery 现有实例?

Javascript 类更改不会更改 Chrome 中的 CSS3 渐变

node.js - 如何处理feathersjs钩子(Hook)内的 promise ?

javascript - Node.js 动态模块(文件)导出

javascript - 如何从nodejs中的Spotify API获取播放列表的每一页