sequelize.js属于非主键上的

时间:2018-07-18 12:16:16

标签: node.js sequelize.js

我用Node.js制作了API服务器。

我还使用sequelize(版本4)与MySQL进行通信。

我的数据库结构是简单的遵循系统。

[model.js]

export const User = sequelize.define('user', {
    no: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    userid: {
        type: Sequelize.STRING,
        allowNull: false,
        unique: true
    },
    userpw: {
        type: Sequelize.STRING,
        allowNull: false
    }
}, {
    freezeTableName: true,
    underscored: true
})

我听说如果targetKey没有选项,主键将被自动引用。

但是如果存在targetKey,请参考该列。

所以我定义了这样的关联。

User.belongsToMany(User, { as: 'follower', through: 'follow', foreignKey: 'follower_id', targetKey: 'userid'});
User.belongsToMany(User, { as: 'following', through: 'follow', foreignKey: 'following_id', targetKey: 'userid'});

我想引用用户的userid。但是在我运行它之后,它仍然引用no(PK)

在控制台中执行的查询在这里。

CREATE TABLE IF NOT EXISTS `follow` (`created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, `follower_id` INTEGER , `following_id` INTEGER , PRIMARY KEY (`follower_id`, `following_id`), FOREIGN KEY (`follower_id`) REFERENCES `user` (`no`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`following_id`) REFERENCES `user` (`no`) ONDELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB;

为什么仍然引用用户的“否”列?

我该如何解决这个问题?

谢谢。

2 个答案:

答案 0 :(得分:1)

targetKeybelongsTo()一起使用 您正在使用belongsToMany(),因此根据sequelize doc,您应该使用otherKey而不是targetKey

User.belongsToMany(User, { as: 'follower', through: 'follow', foreignKey: 'follower_id', otherKey: 'userid'});
User.belongsToMany(User, { as: 'following', through: 'follow', foreignKey: 'following_id', otherKey: 'userid'});

答案 1 :(得分:0)

5.15.0开始,已为多对多关系添加了对sourceKeytargetKey的支持。文档中的This page(在页面底部)提供了此用例的示例。

检查my answer here以获得更多详细信息。