Присоединитесь к нескольким таблицам соединений с помощью Sequelize
У меня есть база данных с тремя основными таблицами: users
, teams
и folders
, соединенные двумя таблицами соединений, users_teams
и teams_folders
. Между пользователями и командами и между командами и папками существует много-много взаимосвязей (пользователь может быть в нескольких командах, а команды могут иметь более одной папки).
Sequelize отлично справляется с управлением отношениями между командами пользователей и команд и папками, но я не могу найти способ установить отношения между пользователями и папками.
Можно ли подключиться к двум таблицам соединений, не обращаясь к необработанному SQL?
Кажется, нет никакого способа выполнить это изящно или в разумном количестве шагов. Я пробовал такие методы, как user.getFolders()
, Folder.findAll({ include: [User] })
, но Sequelize, похоже, не может понять иерархию трех уровней.
Ответы
Ответ 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'
});