Последовательное отношение M:N «многие ко многим» не работает. Ошибка: «SequelizeEagerLoadingError: ${model1} не связана с ${model2}»

Я пытаюсь установить отношения «многие ко многим» между пользователями и ролями через предопределенную таблицу roleUsers.

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:1s работают нормально), как показано ниже

    const roles = await Role.findAll({
      include: [
        {
          model: User,
          as: 'users',
          through: RoleUser,
        },
      ],
    });

Я получаю ошибку ниже

SequelizeEagerLoadingError: User is not associated to Role!

Обычно я пытался вынимать вещи и вставлять обратно в различных комбинациях определенные внешние ключи, другие ключи, псевдонимы в определении и варьировать то, как я вызываю модели (удаляя псевдонимы, через и т. д.). Также я попытался не указывать ссылку в таблице соединений.

Мои модели и отношения расположены на отдельных страницах, но все они соединяются нормально, поскольку я вижу, что отношения 1:M работают нормально, только мои отношения M:M путаются. Буду очень благодарен за любую помощь!


person Hettie McConnell    schedule 11.11.2020    source источник


Ответы (3)


Полагаю, для вашего запроса достаточно указать User с псевдонимом users:

 const roles = await Role.findAll({
      include: [
        {
          model: User,
          as: 'users'
        },
      ],
    });
person Anatoly    schedule 11.11.2020
comment
она использовала для подключения обеих таблиц, поэтому прямой связи с обеими таблицами не будет. - person Arya; 11.11.2020
comment
вы уже подключили их через Role.belongsToMany(User с псевдонимом users - person Anatoly; 11.11.2020

Вы использовали сквозную таблицу для связывания пользователей и ролей, поэтому не будет столбца foreignKey в роли таблицы, а также в таблице пользователей, и если вы хотите добавить role_id в свою пользовательскую таблицу, просто создайте столбец

    role_id: {
        type: DataTypes.INTEGER(),
        allowNull: true
    }

чем добавить role_id с другими данными в роль набора пользовательских таблиц, как показано ниже user.setRoles(req.body.role_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": "[email protected]"
            "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"
        }
    }
],
person Arya    schedule 11.11.2020
comment
Привет, Арья, большое спасибо за подробный ответ, но он все еще не работает! Теперь я получаю сообщение об ошибке User is not associated to RoleUser! - person Hettie McConnell; 12.11.2020

Если у кого-то еще есть эта проблема - единственный способ, который я мог найти, чтобы исправить это, - это указать отношение непосредственно перед его использованием, а не указывать его на отдельной странице моделей/отношений.

person Hettie McConnell    schedule 20.11.2020