Sequelize.js 延续多对多M:N关系不起作用。错误:';SequelizeAgerLoadingError:${model1}未与${model2}'关联;
我试图通过预定义的roleUsers表在用户和角色之间建立多对多关系Sequelize.js 延续多对多M:N关系不起作用。错误:';SequelizeAgerLoadingError:${model1}未与${model2}'关联;,sequelize.js,many-to-many,associations,eager-loading,junction-table,Sequelize.js,Many To Many,Associations,Eager Loading,Junction Table,我试图通过预定义的roleUsers表在用户和角色之间建立多对多关系 const User = sequelize.define('User', { firstName: DataTypes.STRING, lastName: DataTypes.STRING, email: DataTypes.STRING, phone: DataTypes.STRING, password: DataTypes.STRING, deletedAt: DataT
const User = sequelize.define('User', {
firstName: DataTypes.STRING,
lastName: DataTypes.STRING,
email: DataTypes.STRING,
phone: DataTypes.STRING,
password: DataTypes.STRING,
deletedAt: DataTypes.DATE,
},
const Role = sequelize.define('Role', {
roleName: DataTypes.STRING,
},
const RoleUser = sequelize.define('RoleUser', {
userId: {
type: DataTypes.INTEGER,
references: {
model: User,
key: 'id',
},
},
roleId: {
type: DataTypes.INTEGER,
references: {
model: Role,
key: 'id',
},
},
},
Role.belongsToMany(User, {
through: RoleUser,
foreignKey: 'roleId',
otherKey: 'userId',
as: 'users',
});
User.belongsToMany(Role, {
through: RoleUser,
foreignKey: 'userId',
otherKey: 'roleId',
as: 'roles',
});
但是,当我尝试调用此关系(或任何其他M:N关系-1:Ms和1:1工作正常)时,如下所示
我得到下面的错误
SequelizeEagerLoadingError: User is not associated to Role!
我通常会尝试将定义的外键、其他键、定义中的别名以不同的组合取出和放回,并改变调用模型的方式(删除别名,等等)。此外,我还尝试不在连接表中指定引用
我的模型和关系被安排在单独的页面上,但它们都很好地结合在一起,因为我可以看到1:M的关系工作得很好,只是我的M:M关系搞砸了。我将非常感谢任何帮助 我想用别名
users
表示User
就足以满足您的请求:
const roles = await Role.findAll({
include: [
{
model: User,
as: 'users'
},
],
});
您已经使用through表来关联用户和角色,因此在表角色和用户表中都不会有
foreignKey
列,如果您想在用户表中添加role\u id
,而不是简单地创建列
role_id: {
type: DataTypes.INTEGER(),
allowNull: true
}
然后将role\u id
与用户表中的其他数据一起添加
如下所示设置角色user.setRoles(req.body.role\u id)
这将在UserRoles
表中添加数据
Roles.belongsToMany(Users, { through: 'UserRoles', foreignKey: 'role_id', otherKey: 'user_id' });
Users.belongsToMany(Roles, { through: "UserRoles", foreignKey: "user_id", otherKey: "role_id" });
UserRoles.belongsTo(Users, { foreignKey: 'user_id', targetKey: 'id' });
UserRoles.belongsTo(Roles, { foreignKey: 'role_id', targetKey: 'id' });
然后尝试使用下面的api获取所有用户及其角色
let role = await sequelize.UserRoles.findAll({
include: [
{
model: sequelize.Users,
attributes: { exclude: ['password'] }
},
{
model: sequelize.Roles
}
]
});
let result = error.OK;
result.data = role;
logger.info(result);
return res.status(200).send(result)
上面的查询将返回如下数据
"data": [
{
"user_id": 1,
"role_id": 2,
"createdAt": "2020-11-11T11:40:50.999Z",
"updatedAt": "2020-11-11T11:40:50.999Z",
"User": {
"id": 1,
"first_name": "admin1",
"last_name": "Admin1",
"user_name": "admin1",
"email": "admin1@gmail.com"
"role_id": 1,
"user_type": "ADMIN",
"createdAt": "2020-11-11T11:40:49.053Z",
"updatedAt": "2020-11-11T11:40:49.053Z"
},
"Role": {
"id": 1,
"name": "ADMIN"
"createdAt": "2020-11-11T11:37:47.638Z",
"updatedAt": "2020-11-11T11:37:47.638Z"
}
}
],
如果其他人有此问题-我能找到的唯一解决方法是在使用前直接声明关系,而不是将其列在单独的模型/关系页面上。她已使用through连接两个表,因此与您已通过其连接的两个表没有直接关联
Role.belongtomany(用户
别名为users
Hi Arya,非常感谢您的详细回答,但它仍然不起作用!我现在收到一个错误,用户与RoleUser没有关联!
"data": [
{
"user_id": 1,
"role_id": 2,
"createdAt": "2020-11-11T11:40:50.999Z",
"updatedAt": "2020-11-11T11:40:50.999Z",
"User": {
"id": 1,
"first_name": "admin1",
"last_name": "Admin1",
"user_name": "admin1",
"email": "admin1@gmail.com"
"role_id": 1,
"user_type": "ADMIN",
"createdAt": "2020-11-11T11:40:49.053Z",
"updatedAt": "2020-11-11T11:40:49.053Z"
},
"Role": {
"id": 1,
"name": "ADMIN"
"createdAt": "2020-11-11T11:37:47.638Z",
"updatedAt": "2020-11-11T11:37:47.638Z"
}
}
],