导致多对多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,Role.belongsToMany(User,{
    through: RoleUser,foreignKey: 'roleId',otherKey: 'userId',as: 'users',});
  User.belongsToMany(Role,foreignKey: 'userId',otherKey: 'roleId',as: 'roles',});

但是当我尝试称这种关系(或任何其他M:N关系-1:Ms和1:1s工作正常)

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

我在下面遇到错误

SequelizeEagerLoadingError: User is not associated to Role!

我通常尝试取出东西,并以各种组合放回定义的外键,其他键,定义中的别名,并改变我如何调用模型(删除别名,通过等)。我也尝试不在联结表中指定引用。

我的模型和关系安排在单独的页面上,但是它们的结合都很好,因为我可以看到1:M关系很好地工作,只是我的M:M关系搞砸了。我将非常感谢您的帮助!

解决方法

我想以别名User表示users足以满足您的请求:

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

您已使用穿透表来关联用户和角色,因此表角色以及用户表中将没有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": "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"
        }
    }
],
,

如果其他人有这个问题-我能找到解决此问题的唯一方法是在使用关系之前直接声明该关系,而不是在单独的模型/关系页面上列出它。