创建模型之间的关联

时间:2015-09-23 02:06:39

标签: javascript node.js sequelize.js

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

我已将models/文件夹中的模型声明为:

user.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;
};

Role.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。

1 个答案:

答案 0 :(得分:0)

这是我如何设法解决这个问题。不幸的是,这是一次蛮力尝试。

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

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

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

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

相关问题