0
votes

La relation plusieurs-à-plusieurs M: N ne fonctionne pas. Erreur: "SequelizeEagerLoadingError: $ {model1} n'est pas associé à $ {model2}"

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!


0 commentaires

3 Réponses :


0
votes

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'
        },
      ],
    });


2 commentaires

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



0
votes

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
    }


1 commentaires

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!



0
votes

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.


0 commentaires