Sequelize.js 多对多预加载

Sequelize.js many to many eager loading

我有 2 个模型:UserTeam

有多种用户(在本例中为导师和版主)使用 User model() 中的属性进行区分。 UserTeam的关联如下:

User.hasMany(models.Team, {as: 'Mentors', through: models.TeamMentor, foreignKey: 'mentorId'});
User.hasMany(models.Team, {as: 'Moderators', through: models.TeamModerator, foreignKey: 'moderatorId'});


Team.hasMany(models.User, {through: models.TeamMentor, foreignKey: 'teamId'});
Team.hasMany(models.User, {through: models.TeamModerator, foreignKey: 'teamId'});

现在我正在尝试获取团队的详细信息以及分配给团队的所有导师和版主的单独对象。我开始从文档中了解多对多关系的 getter 和 setter,但我不确定如何使用该方法,因为此处两个模型之间有两种不同类型的关联:

  1. 团队 - 导师(用户)
  2. 团队 - 版主(用户)

在这种情况下如何正确查询团队的详细信息?

PS:TeamMentorTeamModerator 是帮助多对多连接的空模型

我假设您在所有这些模型之间有 N:M 关系?像这样:

User ---mentors many---> Teams
User --moderates many--> Teams

Team --is moderated by many--> Users
Team --is mentored by many---> Users

如果是这样,您可能不仅要在已有的 User.hasMany(Team) 中使用 as 选项,还要在 Team.hasMany(User):

中使用
Team.hasMany(models.User, {as: 'mentors', through: models.TeamMentor, foreignKey: 'teamId'});
Team.hasMany(models.User, {as: 'moderators', through: models.TeamModerator, foreignKey: 'teamId'});

我认为您可以在查询过程中像这样急切地加载其中的一部分或全部:

Team.findAll({
  where: {...},
  include: [
    {model: User, as: `moderators` },
    {model: User, as: `mentors` }

    // or just use this to include everything:
    // include: [{all:true}]
  ]
}).then(function(teams) {
  console.log(JSON.stringify(teams));
  // oneTeam.moderators: [array of User]
  // oneTeam.mentors: [array of User]
});

(旁注:我认为您的用户对象当前有一个 'getMentors()' 方法和一个 'mentors' 属性,这是一个团队数组。与 'moderators' 属性。也许将其重命名为 'mentoredTeams' 和 'moderatedTeams' 会使它更清楚?)