我有一个包含三个主要表的数据库:users
,teams
和folders
由两个联结表users_teams
和teams_folders
连接。用户和团队之间以及团队和文件夹之间存在多对多关系(用户可以在多个团队中,团队可以拥有多个文件夹)。
Sequelize在管理用户团队和团队 - 文件夹关系方面做得非常出色,但我找不到在用户和文件夹之间建立关系的方法。
有没有办法在不使用原始SQL的情况下跨两个联结表进行联接?
似乎没有办法优雅地或以合理的步骤完成。我尝试了user.getFolders()
,Folder.findAll({ include: [User] })
等方法,但Sequelize似乎无法理解三级层次结构。
答案 0 :(得分:46)
假设有以下关系:
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
]
}
]
});
您似乎已经使用您在帖子中提供的示例正确地走上正轨:)。您需要更改的唯一事情是不是直接在include
中传递用户模型,而是传递具有模型属性和进一步嵌套的包含属性的对象
答案 1 :(得分:4)
注意以下事项:
User.belongsToMany(Team, {
through: 'users_teams',
foreignKey: 'user_id',
otherKey: 'team_id'
});
Team.belongsToMany(User, {
through: 'users_teams',
foreignKey: 'team_id',
otherKey: 'user_id'
});