在模型之间创建关联
Creating associations between models
我正在使用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。如能提供参考或帮助,我将不胜感激。
我是这样解决这个问题的。不幸的是,这是一个蛮力尝试。
在我的应用程序中,我试图导出一个包含模型名称的数组,同时保持正确的顺序。虽然我们可以使用associate
类方法获得模型之间的关联,但也可以在模型的classMethods
属性中硬编码表创建序列。对于User
模型,可以是
classMethods: {
serial: 1,
associate: function(models) {
User.hasMany(models.ShopUserRoles, {foreignKey: 'user_id' });
}
}
之后,基于包含这些模型名的数组的硬编码序列的简单排序就可以完成这个任务。
使用关联来进行拓扑排序也是一种更好的方法。
相关文章:
- 我想将链接关联到动态创建的p元素上的相应文章
- 如何创建php函数或任何脚本/jquery Javascript,使我能够获取与复选框关联的值并添加它们
- 如何在 Angular JS 中从关联数组创建多个复选框
- 在创建时使用 Sequelize 保存时获取关联
- 创建具有关联 dom 元素的 javascript 对象的首选方法是什么
- 续集查找或创建与包含关联
- 使用javascript创建动态多维关联数组
- 正在创建动态关联阵列
- 如何在创建后立即显示关联模型的特性
- 用javascript创建多维关联数组
- 从js文件而不是xml文件创建关联数组
- 如何使用 KnockoutJS 创建对象的关联数组
- 在 JavaScript 中创建一个关联数组
- 在 jquery 中从隐藏的哈希创建一个关联数组
- SailsJS 在创建具有关联的对象时触发更新
- 从表单输入创建多维关联数组
- 创建具有唯一键的关联数组
- 使用 JQuery 创建关联数组
- 创建具有 rails 活动记录关联的 javascript 变量
- 从两个常规数组创建一个关联数组