【问题标题】:Creating associations between models在模型之间创建关联
【发布时间】:2015-09-23 02:06:39
【问题描述】:

我正在使用 Sequelize.js 创建一些表。这些模型是 User、Shop、Role 和 ShopUserRoles。

我已在 models/ 文件夹中声明模型,例如:

用户.js

module.exports = function (sequelize, DataTypes) {
    var User = sequelize.define('User', {
        id : {
            type: DataTypes.STRING,
            unique: true,
            primaryKey : true
        },
        fullName : {
            type: DataTypes.STRING,
            field: 'full_name',
            allowNull : false
        },
    }, {
        tableName: 'users',

        classMethods: {
            associate: function(models) {
                User.hasMany(models.ShopUserRoles, {foreignKey: 'user_id' });
            }
        },
        timestamps: true,
        createdAt : 'created_at',
        updatedAt : 'updated_at'
    });

    return User;
};

Shop.js

module.exports = function(sequelize, DataTypes) {
    var Shop = sequelize.define('Shop', {
        id : {
            type : DataTypes.INTEGER,
            unique : true,
            primaryKey : true
        },
        shopName : {
            type : DataTypes.STRING,
            field : 'shop_name',
            allowNull : false
        },
        status : {
            type: DataTypes.STRING
        }
    }, {
        tableName : 'shops',

        classMethods : {
            associate : function(models) {
                Shop.hasMany(models.ShopUserRoles, {foreignKey : 'shop_id'});
            }
        },
        timestamps : true,
        createdAt : 'created_at',
        updatedAt: 'updated_at'
    });

    return Shop;
};

角色.js

module.exports = function(sequelize, DataTypes){
    var Role = sequelize.define('Role', {
        id : {
            type: DataTypes.INTEGER,
            unique: true,
            primaryKey: true
        },
        name : {
            type: DataTypes.STRING,
            unique: true
        }
    }, {
        tableName : 'roles',

        classMethods : {
            associate : function(models) {
                Role.hasMany(models.ShopUserRoles, {foreignKey: 'role_id'});
            }
        },
        timestamps : true,
        createdAt : 'created_at',
        updatedAt: 'updated_at'
    });

    return Role;
};

ShopUserRoles.js

module.exports = function(sequelize, DataTypes) {
    var ShopUserRoles = sequelize.define('ShopUserRoles', {
    }, {
        tableName : 'shop_user_roles',

        classMethods: {
            associate: function(models) {
                ShopUserRoles.belongsTo(models.User, {foreignKey: 'user_id' });
                ShopUserRoles.belongsTo(models.Shop, {foreignKey : 'shop_id'});
                ShopUserRoles.belongsTo(models.Role, {foreignKey: 'role_id'});
            }
        },
        timestamps : true,
        createdAt : 'created_at',
        updatedAt : 'updated_at'
    });

    return ShopUserRoles;
};

我已经使用sequelize['import'](FILENAME) 格式导入它们并添加了相应的关联。

现在,由于我们添加了关联,表shop_user_roles 应该在生成前三个表之后创建,否则添加外键将不起作用。但是,我看到 Sequelize 正在尝试在创建 users 表之前创建此表。为了解决这个问题,我有三个选择:

  • 仅在创建表之后分配关联
  • 指定表创建的显式顺序或让 Sequelize 智能地“解决”问题
  • 尝试将整个事情做两次(这很笨拙,我不希望在开发代码中使用它)

至于前两个选项,我不确定如何使用 Sequelize.js 来完成。任何形式的参考或帮助将不胜感激。

我正在使用 Sequelize.js v3.9。

【问题讨论】:

    标签: javascript node.js sequelize.js


    【解决方案1】:

    以下是我设法解决此问题的方法。不幸的是,这是一次蛮力尝试。

    在我的应用程序中,我试图导出一个包含模型名称的数组,同时保持正确的顺序。虽然我们可以使用associate 类方法获取模型之间的关联,但也可以在模型的classMethods 属性中硬编码创建表的序列。对于User 模型,可能是这样的

    classMethods: {
        serial: 1,
        associate: function(models) {
            User.hasMany(models.ShopUserRoles, {foreignKey: 'user_id' });
        }
    }
    

    然后,基于包含这些型号名称的数组上的硬编码序列进行简单排序就可以解决问题。

    使用关联来进行拓扑排序也是一种更好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多