2017-01-03 85 views
0

我发现有关协会,但没有很多东西,我的具体情况,
我创造了一些模型,我尝试将它们联系起来,
所以我认为这是理解的问题数据库建模也。Sequelize CLI创建协会属于关联用户或员工

我有模特用户和工作人员,都分享一个属性user_id。

user.js的

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var User = sequelize.define('User', { 
    user_id: DataTypes.STRING, 
    fullname: DataTypes.STRING, 
    username: DataTypes.STRING, 
    comment: DataTypes.TEXT 
    }, { 
    classMethods: { 
     associate: function(models) { 
     // associations can be defined here 
     User.hasMany(models.Sshkey, {foreignKey: 'sshkey_id'}) 
     } 
    } 
    }); 
    return User; 
}; 

staff.js

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var Staff = sequelize.define('Staff', { 
    user_id: DataTypes.STRING, 
    fullname: DataTypes.STRING, 
    username: DataTypes.STRING, 
    password: DataTypes.STRING, 
    isAdmin: DataTypes.BOOLEAN 
    }, { 
    classMethods: { 
     associate: function(models) { 
     // associations can be defined here 
     Staff.hasMany(models.Sshkey, {foreignKey: 'sshkey_id'}) 
     } 
    } 
    }); 
    return Staff; 
}; 

,我已经得到了它可以属于任何一个用户或工作人员的模型SSHKEY。
我使用Sequelize cli,但尚未进行任何迁移。
而我是相当新的JS和创建数据库,想着数据库模型和协会,我珍玩如果我能写或做这样的事情:

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var Sshkey = sequelize.define('Sshkey', { 
    sshkey_id: DataTypes.STRING, 
    sshkey: DataTypes.TEXT 
    }, { 
    classMethods: { 
     associate: function(models) { 
     // associations can be defined here 

     // My Problem starts here | 
     // Should i write   | 
     //      | 
     //      V 

     Sshkey.hasOne(models.User || models.Staff, {foreignKey: 'user_id'}) 

     // Or maybe: 
     // Sshkey.hasOne(models.User, {foreignKey: 'user_id'}) || 
     // Sshkey.hasOne(models.Staff, {foreignKey: 'user_id'}) 
     // Should i rather rename models.Staffs foreignKey user_id to staff_id? 

     // Or maybe: 
     // Sshkey.hasOne(models.User, {as: 'userkey', foreignKey: 'user_id'}) 
     // Sshkey.hasOne(models.Staff, {as: 'staffkey', foreignKey: 'user_id'}) 

     } 
    } 
    }); 
    return Sshkey; 
}; 

什么是正确的问题的解决方案,如果我以后想要引用sshkey给用户或工作人员?
用staffkeys和userkeys制作两个模型?
由于提前,

BigZ

回答

1

如果你想有一个1:其中外键user_id被添加到Sshkey模型M的关系,应该是:

User.hasMany(models.Sshkey, {foreignKey: 'user_id'}); 
Staff.hasMany(models.Sshkey, {foreignKey: 'user_id'}); 
Sshkey.belongsTo(models.User, {foreignKey: 'user_id'}); 
Sshkey.belongsTo(models.Staff, {foreignKey: 'user_id'}); 

一个问题我有你的例子是user_idsshkey_id都是没有约束的字符串,这使得它们在设计数据库时非常糟糕。要获得用户和他们的SSHKEY:

User.findAll({ 
    where: {}, 
    include: [ { model: Sshkey } ] 
}); 
+0

有什么办法,我可以创建一个使用sequelize从命令行模式,并添加像'PrimaryKey的属性:TRUE','允许为空:FALSE'和'onDelete:“cascade''到字段user_id? 或者可以/我应该只是编辑创建的模型,因为我需要它? 我只是用 './sequelize模型:create --name用户 - 属性user_id:string,fullname:string,username:string,comment:text' 来创建模型。 – BigZ

+0

我假设有一种方法,但我没有实际使用过sequelize cli。 – jjbskir