J'essaie d'établir une relation plusieurs à plusieurs entre les utilisateurs et les rôles via une table roleUsers prédéfinie.
SequelizeEagerLoadingError: User is not associated to Role!
Cependant, lorsque j'essaie d'appeler cette relation (ou toute autre relation M: N - 1: Ms et 1: 1 fonctionnent bien) comme ci-dessous
const roles = await Role.findAll({ include: [ { model: User, as: 'users', through: RoleUser, }, ], });
J'obtiens l'erreur ci-dessous
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', });
J'ai généralement essayé de retirer les choses et de remettre dans diverses combinaisons les clés étrangères définies, d'autres clés, des alias dans la définition et de varier la façon dont j'appelle les modèles (suppression des alias, etc.). J'ai également essayé de ne pas spécifier le référencement dans la table de jonction.
Mes modèles et mes relations sont disposés sur des pages séparées, mais ils se rejoignent tous bien, car je peux voir que les relations 1: M fonctionnent bien, ce ne sont que mes relations M: M qui gâchent. Je serais très reconnaissant pour toute aide!
3 Réponses :
Je suppose qu'indiquer l' User
avec l'alias users
est suffisant pour votre demande:
const roles = await Role.findAll({ include: [ { model: User, as: 'users' }, ], });
elle a utilisé through pour connecter les deux tables donc il n'y aura pas d'association directe avec les deux tables
vous les avez déjà connectés via Role.belongsToMany(User
with alias users
Vous avez utilisé through table pour associer des utilisateurs et des rôles afin qu'il n'y ait pas de colonne foreignKey
dans le rôle de la table et également dans la table des utilisateurs et si vous souhaitez ajouter role_id
dans votre table utilisateur, créez simplement une colonne
"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" } } ],
que d'ajouter role_id
avec d'autres données dans la table user set role comme ci-dessous user.setRoles(req.body.role_id)
cela ajoutera des données dans la table UserRoles
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)
Alors essayez une API comme ci-dessous pour récupérer tous les utilisateurs avec leurs rôles
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' });
La requête ci-dessus renverra des données comme ci-dessous
role_id: { type: DataTypes.INTEGER(), allowNull: true }
Salut Arya, merci beaucoup pour votre réponse détaillée mais cela ne fonctionne toujours pas! User is not associated to RoleUser!
maintenant une erreur indiquant que l' User is not associated to RoleUser!
Si quelqu'un d'autre a ce problème, le seul moyen que j'ai pu trouver pour résoudre ce problème était d'indiquer la relation directement avant de l'utiliser plutôt que de la répertorier sur une page distincte des modèles / relations.