sequelize EmiratesToMany foreignKey属性不起作用

时间:2019-02-25 11:50:47

标签: mysql node.js sequelize.js

我有一个三个表的用户,即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

1 个答案:

答案 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']
            ]
        }
    ]
}) 

这产生了邮件列表,每个邮件包含收件人的子列表。代码可能没有那么紧密...