在模型之间创建关联
Creating associations between models
我正在使用 Sequelize.js 创建一些 table。这些模型是 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)
格式导入它们并添加了相应的关联。
现在,由于我们已经添加了关联,table shop_user_roles
应该在前三个 table 生成之后创建,否则外键添加将不起作用。但是,我看到 Sequelize 正在尝试在创建 users
table 之前创建此 table。为了解决这个问题,我有三个选择:
- 仅在创建 table 之后分配关联
- 分配 table 创建的显式排序或让 Sequelize 'figure' 智能化
- 尝试将整个事情做两次(这很笨拙,我不希望它出现在开发代码中)
至于前两个选项,我不确定如何使用 Sequelize.js。任何类型的参考或帮助将不胜感激。
我正在使用 Sequelize.js v3.9.
以下是我设法解决这个问题的方法。不幸的是,这是一次蛮力尝试。
在我的应用程序中,我试图导出一个包含模型名称的数组,同时保持正确的顺序。虽然我们可以使用 associate
class 方法获得模型之间的关联,但也可以在 classMethods
[=24] 中硬编码 table 创建的序列=] 模型。对于 User
模型,可能类似于
classMethods: {
serial: 1,
associate: function(models) {
User.hasMany(models.ShopUserRoles, {foreignKey: 'user_id' });
}
}
之后,基于包含这些型号名称的数组上的硬编码序列号进行简单排序就可以解决问题。
使用关联来进行拓扑排序也是一种更好的方法。
我正在使用 Sequelize.js 创建一些 table。这些模型是 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)
格式导入它们并添加了相应的关联。
现在,由于我们已经添加了关联,table shop_user_roles
应该在前三个 table 生成之后创建,否则外键添加将不起作用。但是,我看到 Sequelize 正在尝试在创建 users
table 之前创建此 table。为了解决这个问题,我有三个选择:
- 仅在创建 table 之后分配关联
- 分配 table 创建的显式排序或让 Sequelize 'figure' 智能化
- 尝试将整个事情做两次(这很笨拙,我不希望它出现在开发代码中)
至于前两个选项,我不确定如何使用 Sequelize.js。任何类型的参考或帮助将不胜感激。
我正在使用 Sequelize.js v3.9.
以下是我设法解决这个问题的方法。不幸的是,这是一次蛮力尝试。
在我的应用程序中,我试图导出一个包含模型名称的数组,同时保持正确的顺序。虽然我们可以使用 associate
class 方法获得模型之间的关联,但也可以在 classMethods
[=24] 中硬编码 table 创建的序列=] 模型。对于 User
模型,可能类似于
classMethods: {
serial: 1,
associate: function(models) {
User.hasMany(models.ShopUserRoles, {foreignKey: 'user_id' });
}
}
之后,基于包含这些型号名称的数组上的硬编码序列号进行简单排序就可以解决问题。
使用关联来进行拓扑排序也是一种更好的方法。