【问题标题】:Multiple foreignkey in Sequelize + NodejsSequelize + Nodejs中的多个外键
【发布时间】:2017-09-04 14:28:05
【问题描述】:

我有一个 USERS 表,其中有两个主键:id 和 mail,Users 与另一个表 Contacts 有 1:1 的关系。我想在与邮件和 ID 相关的 RefreshToken 表中“导出”两个外键。

USERS 表定义:

module.exports = function (sequelize, DataTypes) {
  const Users = sequelize.define('Users', {
    id: {
      type: DataTypes.INTEGER(11),
      autoIncrement: true,
      primaryKey: true
    },
    firstname: {
      type: DataTypes.STRING,
      allowNull: true
    },
    lastname: {
      type: DataTypes.STRING,
      allowNull: true
    },
    email: {
      type: DataTypes.STRING,
      allowNull: false,
      primaryKey: true
    },
    password: {
      type: DataTypes.STRING,
      allowNull: false
    }
  }, {
    classMethods: {
      associate: function (models) {
        Users.hasOne(models.RefreshToken, {foreignKey:'userId'}
      }
    },
    tableName: 'Users',
    hooks: {
      beforeCreate: user => {
        const salt = bcrypt.genSaltSync();
        user.password = bcrypt.hashSync(user.password, salt);
      }
    }
  });

RefreshToken 表定义:

module.exports = function (sequelize, DataTypes) {
  const RefreshToken = sequelize.define('RefreshToken', {
    idRefreshToken: {
      type: DataTypes.INTEGER(11),
      autoIncrement: true,
      primaryKey: true
    },
    token: {
      type: DataTypes.TEXT,
      allowNull: true
    },
    expire: {
      type: DataTypes.DATE,
      allowNull: true
    }

  }, {
    tableName: 'RefreshToken'
  });

【问题讨论】:

    标签: javascript mysql node.js express sequelize.js


    【解决方案1】:

    如果不查看您的代码,我不能 100% 确定,但我认为您正在尝试做的是这个

     db.define('user', {/* ... */});
     db.define('contact', {/* ... */});
    
     db.model('contact').belongsTo(db.model('user'), { as: 'contact' })
     db.model('contact').belongsTo(db.model('user'), { as: 'other' })
     db.model('user').hasOne(db.model('user'), { as: 'contact' })
     db.model('user').hasOne(db.model('user'), { as: 'other' })
    

    这应该为联系人表提供两列,userIdotherId 都引用用户表。你应该可以拨打someUser.getContact()someUser.getOther()

    【讨论】:

    • 我的问题更完整了!
    【解决方案2】:

    您可能尝试做的可能如下所示:

    module.exports = function (sequelize, DataTypes) {
      const Users = sequelize.define('Users', {
        id: {
          type: DataTypes.INTEGER(11),
          autoIncrement: true,
          primaryKey: true
        },
        firstname: {
          type: DataTypes.STRING,
          allowNull: true
        },
        lastname: {
          type: DataTypes.STRING,
          allowNull: true
        },
        email: {
          type: DataTypes.STRING,
          allowNull: false,
          primaryKey: true
        },
        password: {
          type: DataTypes.STRING,
          allowNull: false
        }
      });
    
      Users.associate = (models) => {
        Users.belongsTo(models.RefreshToken, {
          foreignKey: 'userId'
        });
        Users.belongsTo(models.RefreshToken, {
          foreignKey: 'email'
        });
      };
    
      return Users;
    }
    

    我注意到您使用的是 sequelize v3 样式,请尝试阅读有关如何迁移到当前支持的 v4 的 sequelize 文档。

    【讨论】:

    • 我收到此错误:未处理的拒绝错误:SequelizeDatabaseError:ER_CANNOT_ADD_FOREIGN:无法添加外键约束
    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 2019-10-06
    • 2023-03-31
    • 2014-05-21
    • 1970-01-01
    • 2018-08-21
    • 2022-08-02
    • 1970-01-01
    相关资源
    最近更新 更多