Подтвердить что ты не робот

Присоединитесь к нескольким таблицам соединений с помощью Sequelize

У меня есть база данных с тремя основными таблицами: users, teams и folders, соединенные двумя таблицами соединений, users_teams и teams_folders. Между пользователями и командами и между командами и папками существует много-много взаимосвязей (пользователь может быть в нескольких командах, а команды могут иметь более одной папки).

Sequelize отлично справляется с управлением отношениями между командами пользователей и команд и папками, но я не могу найти способ установить отношения между пользователями и папками.

Можно ли подключиться к двум таблицам соединений, не обращаясь к необработанному SQL?

Кажется, нет никакого способа выполнить это изящно или в разумном количестве шагов. Я пробовал такие методы, как user.getFolders(), Folder.findAll({ include: [User] }), но Sequelize, похоже, не может понять иерархию трех уровней.

4b9b3361

Ответ 1

Предполагая следующие соотношения:

User.belongsToMany(Team, { through: 'users_teams'});
Team.belongsToMany(User, { through: 'users_teams'});

Folder.belongsToMany(Team, { through: 'teams_folders'});
Team.belongsToMany(Folder, { through: 'teams_folders'});

Вы должны иметь возможность загружать все за один раз, используя вложенные функции:

User.findAll({
  include: [
    {
      model: Team, 
      include: [
        Folder
      ]  
    }
  ]
});

Вы, кажется, уже на правильном пути уже с примером, который вы указали в своем посте:). Единственное, что вам нужно изменить - вместо передачи модели User непосредственно в include, вы передаете объект с свойством model и еще одним вложенным свойством include

Ответ 2

Обратите внимание на следующее:

  • Определить отношения в обоих направлениях
  • Проверьте, что у вас есть foreignKey, otherKey в правильном порядке.
User.belongsToMany(Team, {
  through: 'users_teams',
  foreignKey: 'user_id',
  otherKey: 'team_id'
});

Team.belongsToMany(User, {
  through: 'users_teams',
  foreignKey: 'team_id',
  otherKey: 'user_id'
});