すべてのモデルがよさそうだ。問題は協会にあります。
同じ2つのモデル間に複数の関連付けを定義する場合は、クエリでそれらを互いに区別するために、異なるエイリアスを指定する必要があります。
User.hasMany(Messages, {
foreignKey: 'senderId',
as: 'OutgoingMessages'
});
User.hasMany(Messages, {
foreignKey: 'receiverId',
as: 'IncomingMessages'
});
Messages.belongsTo(models.User, {
foreignKey: "senderId",
as: 'Sender'
});
Messages.belongsTo(models.User, {
foreignKey: "receiverId",
as: 'Receiver'
});
また、モデル定義の直後、またはassociate
のような静的メソッドのいずれかで、同じ方法で関連付けを定義することをお勧めします。 。後者のアプローチは、models
を使用して相互参照することなく、独自のモジュールで各モデルを定義できるため、望ましい方法です。 associate
のパラメータ 特定のモデルに関連付ける必要がある他のモデルにアクセスする方法。
最後の注意:アソシエーション定義の左側にあるモデルが独自のassociate
でアソシエーションを定義してみてください メソッド。つまり
models.Message.belongsTo(Conversations);
Message
に含める必要があります モデルassociate
方法:
Message.belongsTo(models.Conversations);
そうすれば、特定のモデルから他のモデルへのリンクを定義するすべての関連付けを見つける場所を常に知ることができます。
更新
メッセージの作成中に使用するには、見つかった会話または作成した会話を変数に保存する必要があります。
let conversation = await Conversations.findOne({
where:{
user1:{[Op.or]:[req.user.id,post.userId]},
user2:{[Op.or]:[req.user.id,post.userId]},
PostId:req.body.postId,
}
})
if (!conversation){
conversation = await Conversations.create({
user1: req.user.id,
user2: post.userId,
PostId:req.body.postId,
})
}
const newMessage = await Messages.create({
senderId: req.user.id,
receiverId: post.userId,
message: req.body.message,
conversationId:conversation.id
})
res.status(201).send({
msg: "upload successful",
});
then/catch
を混同しないでください およびawait
。 await
を使用する場合 すでに結果または例外が発生しています(try/catch
を使用して処理できます) 。