【问题标题】:Sequelize.js many to many eager loadingSequelize.js 多对多急切加载
【发布时间】:2015-05-13 11:25:30
【问题描述】:

我有 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 是帮助多对多连接的空模型

【问题讨论】:

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


    【解决方案1】:

    我假设您在所有这些模型之间都有 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()”方法和一个“导师”属性,这是一个团队数组。“主持人”属性也是如此。也许将其重命名为“mentoredTeams” ' 和 'moderatedTeams' 会更清楚吗?)

    【讨论】:

    • 工作就像一个魅力!我错过了关联中的as 选项。谢谢 :) Sequelize 开发人员需要大量改进文档!大多数事情甚至没有记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多