Я был стеком уже неделю, пытаясь исправить связь с секвелированием.Я искал в Интернете решение, но похоже, что ни у кого не было такой же проблемы, как у меня.Когда я добавляю ассоциации в модели, он вообще не создается.принадлежность Никогда не добавляет поле внешнего ключа в связанную таблицу.Я поделился своей схемой в деталях, надеясь, что кто-то там поможет мне решить проблему.Я также попытался добавить внешние ключи непосредственно в модели и миграции, но безуспешно.
У меня есть 4 модели: Пользователь, Роль, Разрешение и Пост.У пользователя есть много сообщений, пользователь принадлежит ToMany ролям через таблицу соединений RoleUser , а роль принадлежит пользователям ToMany через таблицу соединений RoleUser.Разрешения принадлежит toMany ролям через PermissionRol таблица соединений.
//User Model
'use strict';
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', {
id: {type:DataTypes.UUID,allowNull:false,unique:true,primaryKey:true},
UserName: {type:DataTypes.STRING,unique:true,allowNull:false},
Email: {type:DataTypes.STRING,allowNull:false,unique:true,validate: { isEmail: {msg: "Invalid Email"} }},
Password: {type:DataTypes.STRING,allowNull:false}
}, {});
User.associate = function(models) {
User.hasMany(models.Post,
{
foreignKey:'UserId',
as:'posts',
sourceKey:'id'
}),
User.belongsToMany(models.Role,
{
through: 'RoleUser',
foreignkey:'UserId'
})
};
return User;
};
//Post model
'use strict';
module.exports = (sequelize, DataTypes) => {
const Post = sequelize.define('Post', {
id: {type:DataTypes.UUID,allowNull:false,unique:true,primaryKey:true},
Title: DataTypes.STRING,
Post: DataTypes.TEXT
}, {});
Post.associate = function(models) {
Post.belongTo(models.User,
{
foreignKey:'UserId',
sourceKey:'id'
})
};
return Post;
};
//Role Model
'use strict';
module.exports = (sequelize, DataTypes) => {
const RoleUser = sequelize.define('RoleUser', {
RoleId: {type:DataTypes.UUID,allowNull:false,primaryKey:true},
UserId: {type:DataTypes.UUID,allowNull:false,primaryKey:true},
}, {});
RoleUser.associate = function(models) {
// associations can be defined here
RoleUser.belongsTo(models.User,{foreignKey:'UserId'}),
RoleUser.belongsTo(models.Role,{foreignKey:'RoleId'})
};
return RoleUser;
};
//Permission Model
'use strict';
module.exports = (sequelize, DataTypes) => {
const Permission = sequelize.define('Permission', {
id: {type:DataTypes.UUID,allowNull:false,unique:true,primaryKey:true},
Name: DataTypes.STRING,
Description: DataTypes.STRING
}, {});
Permission.associate = function(models) {
// associations can be defined here
Permission.belongsToMany(models.Role,
{
through:'PermissionRole',
foreignKey:'PermissionId'
})
};
return Permission;
};
ТАБЛИЦА МИГРАЦИЙ
//users
'use strict';
const uuidv4 = require('uuid/v4');
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Users', {
id: {
allowNull: false,
primaryKey: true,
type: Sequelize.UUID
defaultValue:uuidv4()
},
UserName: {
type: Sequelize.STRING
},
Email: {
type: Sequelize.STRING
},
Password: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Users');
}
};
//Post migration
'use strict';
const uuidv4 = require('uuid/v4');
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('posts', {
id: {
allowNull: false,
primaryKey: true,
type: Sequelize.UUID,
defaultValue:uuidv4()
},
Title: {
type: Sequelize.STRING
},
Post: {
type: Sequelize.Text
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('CourseCategories');
}
};
//Role migration
'use strict';
const uuidv4 = require('uuid/v4');
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Roles', {
id: {
allowNull: false,
primaryKey: true,
type: Sequelize.UUID,
defaultValue:uuidv4()
},
Name: {
type: Sequelize.STRING
},
Description: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Roles');
}
};
//Permission migration
'use strict';
const uuidv4 = require('uuid/v4');
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Permissions', {
id: {
allowNull: false,
primaryKey: true,
type: Sequelize.UUID,
defaultValue:uuidv4()
},
Name: {
type: Sequelize.STRING
},
Description: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Permissions');
}
};
После запускамиграции, все таблицы создаются как ожидалось.Даже распределительные таблицы roleuser и разрешение создаются sequelize.
Однако внешние ключи не добавляются.Например, таблица записей не имеет ожидаемого идентификатора пользователя ForeignKey
, когда я просматриваю таблицы в представлении отношений PhpMyAdmin, между таблицами не существует внешних ключей или отношений.
, когда я пытаюсь выполнить запрос исписок ролей с разрешениями, связанными с каждой ролью, как показано ниже, я получаю эту ошибку:
SequelizeEagerLoadingError: Permission is not associated to Role!
Вот мой запрос:
exports.rolesWithPermissions = function(req, res){
Role.findAll({
include:[{model:Permission}]
}).then((roleperms)=>{
return res.json({status:200,roleperms:roleperms});
}).catch((error)=>{
console.log(error);
return res.send({error:error.error});
});
};
Я получаю похожую ошибку при получении пользователей с сообщениями.Короче говоря, отношения (ассоциации) никогда не создаются.Я использую MySQL диалект с Sequelize версии 4.31.2 .Даже я пытался использовать Sqlite с теми же результатами.
Я также пытался переустановить сиквелиз без удачи.Что я могу делать не так, любезно помогите.