【问题标题】:Sequelize cli creating association belongsto user or staffSequelize cli 创建关联属于用户或员工
【发布时间】:2017-05-17 00:56:42
【问题描述】:

我发现了很多关于关联的东西,但对我的特殊情况却一无所获,
我创建了一些模型,我正在尝试将它们关联起来,
所以我认为这也是理解数据库建模的问题。

我有模型用户和员工,它们共享一个属性 user_id。

用户.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 引用给用户或工作人员,什么是正确的解决方案?
使用人员密钥和用户密钥制作两个模型?
提前致谢,

大Z

【问题讨论】:

    标签: mysql node.js sequelize.js models sequelize-cli


    【解决方案1】:

    如果您想要将外键 user_id 添加到 Sshkey 模型的 1: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 都是没有约束的字符串,这使得它们非常糟糕foreignKey 并且对于设计数据库来说很糟糕。获取用户及其 Sshkey:

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

    【讨论】:

    • 我有什么方法可以使用命令行中的 sequelize 创建模型并将primaryKey: trueallowNull: falseonDelete: 'cascade' 等属性添加到字段 user_id?或者我可以/应该根据需要编辑创建的模型吗?我刚刚使用./sequelize model:create --name User --attributes user_id:string,fullname:string,username:string,comment:text 来创建模型。
    • 我认为有办法,但我之前没有真正使用过 sequelize cli。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2017-07-21
    • 2020-08-12
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多