使用Sequelize加入多个联结表

时间:2014-09-17 00:39:18

标签: node.js sequelize.js

我有一个包含三个主要表的数据库:usersteamsfolders由两个联结表users_teamsteams_folders连接。用户和团队之间以及团队和文件夹之间存在多对多关系(用户可以在多个团队中,团队可以拥有多个文件夹)。

Sequelize在管理用户团队和团队 - 文件夹关系方面做得非常出色,但我找不到在用户和文件夹之间建立关系的方法。

有没有办法在不使用原始SQL的情况下跨两个联结表进行联接?

似乎没有办法优雅地或以合理的步骤完成。我尝试了user.getFolders()Folder.findAll({ include: [User] })等方法,但Sequelize似乎无法理解三级层次结构。

2 个答案:

答案 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)

注意以下事项:

  • 双向
  • 中定义关系
  • 检查您是否拥有foreignKey,正确顺序中的其他键
User.belongsToMany(Team, {
  through: 'users_teams',
  foreignKey: 'user_id',
  otherKey: 'team_id'
});

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