我有一个帖子的续集模型。我希望您可以检索回复到一个帖子,以及帖子作为回复的帖子。
理论上,这只需要一个外键,一个回复'字段,所以你有表:
----------------------
|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
答案 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]);
上保留两个关联(hasMany
和hasOne
)。我建议你只使用单一关联,第二个可以通过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
});