我有一个三个表的用户,即message和message_recipients。表message_recipients是在消息和用户表之间创建映射的表。该表有两列,一列是users_id,它指向用户表中的相应用户,另一列是message_id,它指向消息表中的相应消息。
现在这就是我定义关联的方式。
Message.hasMany(MessageRecipient, {as: {singular: 'recipient', plural: 'recipients'}, foreignKey: 'message_id', targetKey: 'id'});
Message.belongsToMany(User, {as: {singular: 'recipient', plural: 'recipients'}, through: MessageRecipient, foreignKey: 'recipient_id'});
MessageRecipient.belongsTo(Message, {as: 'message', foreignKey: 'message_id', targetKey: 'id'});
MessageRecipient.belongsTo(User, {as: 'recipient', foreignKey: 'recipient_id', targetKey: 'id'});
现在如果在提取邮件时包含recipients
,我会得到一条错误消息,
unknown column user_id in message_recipients columns.
已经有一个类似的question问题。对此的答案建议定义引用。但是在定义引用之后,我遇到了同样的错误。
更新
我决定将列名从receiver_id重命名为user_id。因为后继需要在messages_recipients表中查找user_id列。
但是在将column_id重命名为user_id之后,它开始寻找column_id并且错误消息变为
unknown column recipient_id in table message_recipients
答案 0 :(得分:1)
Sequelizer的这一部分功能强大但令人困惑。
假设您尝试将message.id链接到message_recipient.message_id,并将message_recipient.user_id链接到user_id,请尝试以下操作:
Message.hasMany(MessageRecipient,
{sourceKey : 'id', // message table
foreignKey: 'message_id'} // recipient table
);
MessageRecipient.belongsTo(User,
{foreignKey : 'user_id', // recipient
otherKey: 'id' // user
});
Message.belongsToMany(User, {through: MessageRecipient,
foreignKey: 'message_id', // recipient
otherKey : 'user_id' // recipient.
});
Message.findAll({
attributes: ['id', 'message_body'],
include: [
{
model: User,
attributes: [
['id','recipient_id'],
['username','recipient_name']
]
}
]
})
这产生了邮件列表,每个邮件包含收件人的子列表。代码可能没有那么紧密...