2017-09-04 64 views
0

我有一個USERS表,其中有兩個主鍵:id和mail,用戶與另一個表Contacts有1:1的關係。我想在RefreshToken表中將兩個外鍵「導出」爲郵件和ID。在Sequelize + Nodejs中的多個foreignkey

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' 
    }); 

回答

0

我不是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()

+0

我讓我的問題更完整! – tinytanks

0

什麼,你可能會試圖做的可能是這樣的:

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的風格,嘗試閱讀關於如何將sequelize文檔遷移到目前支持的v4。

+0

我收到此錯誤:未處理的拒絕錯誤:SequelizeDatabaseError:ER_CANNOT_ADD_FOREIGN:無法添加外鍵約束 – tinytanks

+0

嘗試閱讀sequelize文檔 –