如何实施“回复”#39;和回复'关于Sequelize模型的关联

时间:2017-03-01 20:09:19

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

我有一个帖子的续集模型。我希望您可以检索回复一个帖子,以及帖子作为回复的帖子。

理论上,这只需要一个外键,一个回复'字段,所以你有表:

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

为了让帖子回复1,您需要replyId 1, 要查看3所回复的帖子,您需要查找id的{​​{1}}

续集关系是:

1

然后将帖子添加到db:

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,而sequelize并没有返回任何对id的回复3

1 个答案:

答案 0 :(得分:2)

出现此问题是因为您希望在单个字段var trace1 = { x: [myData[0]['disp'], myData[1]['disp']], y: [myData[0]['qsec'], myData[0]['qsec']], mode: 'markers', marker: { color: 'green', size: 20 }, xaxis: 'x', yaxis: 'y' }; var trace2 = { x: [myData[0]['disp'], myData[1]['disp']], y: [myData[0]['hp'], myData[0]['hp']], mode: 'markers', marker: { color: 'green', size: 20 }, xaxis: 'x', yaxis: 'y2' }; var trace3 = { x: [myData[0]['hp'], myData[0]['hp']], y: [myData[0]['qsec'], myData[0]['qsec']], mode: 'markers', marker: { color: 'green', size: 20 }, xaxis: 'x2', yaxis: 'y4' }; Plotly.addTraces(el.id, [trace1,trace2,trace3]); 上保留两个关联(hasManyhasOne)。我建议你只使用单一关联,第二个可以通过replyId轻松实现。让我告诉你如何做到这一点

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;

在SQL下面生成

firstReply.getReplyingTo().then((replyingToPost) => {
    // here we get the first created post
});