Попытка найти объект с ассоциацией Many to Many Sequelize - PullRequest
2 голосов
/ 25 мая 2020

ВОЗОБНОВЛЕНИЕ ПРОБЛЕМЫ: У меня возникают проблемы при попытке выполнить findOne или findAll. В ответах findOne или findAll я улавливаю всю информацию от пользователя, но в ответе нет никаких данных о «t_roles», связанных с этим пользователем. Но странная проблема заключается в том, что если я использую raw: true внутри findOne, например, отображается информация о ролях.

У меня две модели

Пользователь:

const dbUser = {
  a_id: {
    primaryKey: true,
    autoIncrement: true,
    type: Sequelize.BIGINT,
  },
  a_date_created: {
    type: Sequelize.DATE,
    allowNull: false,
  },
  a_first_name: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  a_last_name: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  a_email: {
    type: Sequelize.TEXT,
    unique: true,
    allowNull: false,
  },
  a_password: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  a_birthday: {
    type: Sequelize.DATE,
    allowNull: false,
  },
  a_is_active: {
    type: Sequelize.BOOLEAN,
    allowNull: false,
  },
};

User.init(dbUser, {
  sequelize: db,
  modelName: 't_user',
  timestamps: false,
  tableName: 't_users',
});


User.associate = (models) => {
  console.log('ASSOCIADO')
  User.belongsToMany(models.Role, {
    through: { model: UserRole, unique: false },
    as: 'roles',
    foreignKey: 'a_user',
    otherKey: 'a_role',
  });
};

и роль:

const dbRole = {
  a_id: {
    primaryKey: true,
    autoIncrement: true,
    type: Sequelize.BIGINT,
  },
  a_role: {
    type: Sequelize.STRING,
    allowNull: false,
  },
};

Role.init(dbRole, {
  sequelize: db,
  modelName: 't_role',
  timestamps: false,
  tableName: 't_roles',
});

Role.associate = (models) => {
  Role.belongsToMany(models.User, {
    through: { model: UserRole, unique: false },
    as: 'UserOfRoles',
    foreignKey: 'a_role',
    otherKey: 'a_user',
  });
};

Как видите, я связываю их с помощью другой модели, UserRole:

const dbUserRole = {
  a_id: {
    primaryKey: true,
    autoIncrement: true,
    type: Sequelize.BIGINT,
  },
  a_role: {
    type: Sequelize.INTEGER,
    allowNull: false,
    primaryKey: false,
    references: {
      model: Role,
      key: 'a_id',
    },
    onDelete: 'CASCADE',
  },
  a_user: {
    type: Sequelize.INTEGER,
    allowNull: false,
    references: {
      model: User,
      key: 'a_id',
    },
    onDelete: 'CASCADE',
  },
};

UserRole.init(dbUserRole, {
  sequelize: db,
  modelName: 't_user_role',
  timestamps: false,
  tableName: 't_user_role',
});


UserRole.associate = (models) => {
  UserRole.belongsTo(models.User, { targetKey: 'a_id', foreignKey: 'a_user' });
  UserRole.belongsTo(models.Role, { targetKey: 'a_id', foreignKey: 'a_role' });
};

Чтобы создать пользователя с ролью (admin), я делаю как в приведенном ниже коде:

onst createAdmin = async (body) => {
  try {
    const userResult = await createUser(body);
    if (userResult.error) {
      return {
        ok: false,
        error: userResult.error,
      };
    }
    const isAdmin = await UserRole.create({
      a_role: 1,
      a_user: userResult.a_user_id,
    });

    return {
      ok: true,
    };
  } catch (error) {
    return {
      ok: false,
      error,
    };
  } 

Кажется, все работает нормально, потому что создается пользователь, и ассоциация также использует "t_user_role", потому что данные также создаются в таблице. Поскольку мне грустно из-за проблемного резюме, моя проблема в том, когда я пытаюсь выполнить findOne или findAll. Например, когда я пробую приведенный ниже код, я улавливаю всю информацию от пользователя, но в ответе нет никаких данных о «t_roles», связанных с этим пользователем.

const { body } = req;
  try {
    const result = await User.findOne({
      where: {
        a_id: 1,
      },
      include: [
        {
          association: 'roles',
          attributes: ['a_role'],
          through: {
            attributes: [],
          },
        },
      ],
    });
    console.log('====================================');
    console.log(JSON.stringify(result, null, 2));
    console.log('====================================');
  } catch (error) {
    console.error(error);
  } 

Если я использую raw: true внутри findOne, например, отображается информация о ролях, поэтому я предполагаю, что ассоциация верна. Я очень ценю любую помощь, чтобы найти то, что мне здесь не хватает. Спасибо

1 Ответ

0 голосов
/ 29 мая 2020

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

...