Невозможно правильно использовать многие-ко-многим, используя belongsToMany

#sequelize.js

#sequelize.js

Вопрос:

Я застрял, пытаясь разобраться в этом в течение некоторого времени. Я читал, что hasMany это неправильный подход при попытке создать many-to-many ассоциацию. У меня есть две таблицы для создания следующей ассоциации User и Follower (ужасное имя на данный момент).

Последователь

 const follower = (sequelize, DataTypes) => {
  const Follower = sequelize.define('follower', {
    follower_id: {
        type: DataTypes.INTEGER,
        allowNull: false,
        validate: {
            notNull: true
        }
    },
    following_id: {
        type: DataTypes.INTEGER,
        allowNull: false,
        validate: {
            notNull: true
        }
    }
  });

  return Follower;
};

module.exports = follower; 
 

Далее у нас есть модель пользователя в виде

 const user = (sequelize, DataTypes) => {
  const User = sequelize.define('user', {
      email: {
        type: DataTypes.STRING,
        unique: true,
        allowNull: false,
        validate: {
            isEmail: true,
            notEmpty: true
        }
      },
      password: {
        type: DataTypes.STRING,
        allowNull: false,
        validate: {
            notEmpty: true
        }
      },
      username: {
        type: DataTypes.STRING,
        unique: true,
        allowNull: false
      }
  });

  User.associate = (models) => {
    User.hasMany(models.post, { foreignKey: 'user_id' });
    User.belongsToMany(models.user, { 
        through: 'users_followers', 
        foreignKey: 'follower_id',
        otherKey: 'following_id',
        as: 'followers', 
    });
    User.belongsToMany(models.user, { 
        through: 'users_followers', 
        foreignKey: 'following_id',
        otherKey: 'follower_id',
        as: 'following', 
    });

  return User;
};

module.exports = user;
 

Я делаю что-то не так в отношении создания ассоциации «многие ко многим»? Я спрашиваю, так как я продолжаю пытаться изменить разницу, но не могу выполнить запрос при попытке include: [db.follower]

Спасибо за всю помощь

Дополнительная информация

Выполняемый запрос:

 const fetchUser = async (root, args, context) => {
  const { db, user } = await context();
  const { id } = args;
  
  const fetchedUser = await db.user.findOne({ 
      attributes: {
          include: [
            [sequelize.literal('(select count(*) from users_followers where users_followers.follower_id=users.id)'), 'followers_count'],
        ]
    },
    include: [
        'followers',
        'following'
    ],
    where: { 
        id 
    }, 
    raw: true 
});

return fetchedUser;
 

Комментарии:

1. Показать запрос, который вы пытаетесь выполнить со многими-ко-многим

2. @Anatoly Спасибо за ответ. В нижней части вопроса я добавил запрос, в котором я выполняю много-ко-многим

Ответ №1:

В include опции вы всегда должны указывать модель, которая находится на другой стороне определенной ассоциации. В этом случае это User модель с двумя разными псевдонимами:

 include: [
{
  model: db.user,
  as: 'followers'
}, {
  model: db.user,
  as: 'following'
}],
 

Комментарии:

1. Спасибо за эту информацию. Хотя у меня есть два вопроса. В настоящее время он не возвращает никаких значений (информация о подписчиках / подписчиках равна нулю), хотя мой подзапрос возвращает точное количество подписчиков / подписчиков пользователя. Есть ли что-то еще, что мне нужно включить? Я попытался добавить предложение where ко второму и "column following.follower_id does not exist" не понял, почему в нем упоминается следующая таблица, когда она должна быть users_followers через . Еще раз спасибо за помощь и указатель.

2. Вы можете проверить и сравнить SQL, сгенерированный Sequelize, с вашим собственным SQL