Sequelize.js多对多渴望加载

Bas*_*ngh 2 database many-to-many eager-loading node.js sequelize.js

我有2个型号:UserTeam

有多种类型的用户(在本例中为Mentors和Moderators),它们使用Usermodel()中的属性进行区分。User和之间的关联Team如下:

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'});
Run Code Online (Sandbox Code Playgroud)

现在,我尝试获取团队的详细信息以及分配给团队的所有指导者和主持人的单独对象。我从文档中了解了多对多关系的获取器和设置器,但是由于这两个模型之间存在两种不同的关联,因此我不确定如何使用该方法:

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

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

PS:TeamMentor并且TeamModerator是空模型,可以帮助许多对许多联接

st.*_*ver 5

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

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

Team --is moderated by many--> Users
Team --is mentored by many---> Users
Run Code Online (Sandbox Code Playgroud)

如果是这样,您可能as不仅要在User.hasMany(Team)已有的中使用该选项,还要在中使用该选项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'});
Run Code Online (Sandbox Code Playgroud)

我认为您可以在查询期间急于加载其中的一些或全部:

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]
});
Run Code Online (Sandbox Code Playgroud)

(旁注:我认为您的User对象当前具有一个“ getMentors()”方法和一个“ mentors”属性,该属性是一个Team数组。与“ moders”属性相同。也许将其重命名为“ mentoredTeams”和“主持人团队会更清楚吗?)