Sequelize.js 延续多对多M:N关系不起作用。错误:';SequelizeAgerLoadingError:${model1}未与${model2}'关联;

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

我试图通过预定义的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: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"
        }
    }
],