Я использую 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;
};
ShopU serRoles.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.