Sequelize.js很多人都渴望加载

时间:2015-03-11 15:21:33

标签: database node.js many-to-many sequelize.js eager-loading

我有2个模型:UserTeam

有多种用户(在本例中为导师和版主)使用User模型()中的属性进行区分。 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. 团队 - 主持人(用户)
  3. 在这种情况下如何正确查询团队的详细信息?

    PS:TeamMentorTeamModerator是空模型,可以帮助多对多联接

1 个答案:

答案 0 :(得分:4)

我假设你在所有这些模特之间有N:M的关系?像这样:

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

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

如果是这样,您可能不仅要在as中使用User.hasMany(Team)选项,还要在Team.hasMany(User)中使用<{1}}:

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'属性,这是一个Team数组。对于'版主'属性是相同的。也许将其重命名为'mentoredTeams '和'moderatedTeams'会让它变得更清晰?)