web-dev-qa-db-fra.com

Rejoignez plusieurs tables de jonction avec Sequelize

J'ai une base de données avec trois tables principales: users, teams et folders jointes par deux tables de jonction, users_teams Et teams_folders. Il existe une relation plusieurs à plusieurs entre les utilisateurs et les équipes et entre les équipes et les dossiers (un utilisateur peut appartenir à plusieurs équipes et les équipes peuvent posséder plusieurs dossiers).

Sequelize fait un excellent travail de gestion de la relation utilisateurs-équipes et équipes-dossiers, mais je ne trouve aucun moyen d'établir une relation entre les utilisateurs et les dossiers.

Existe-t-il un moyen de se joindre à deux tables de jonction sans recourir au SQL brut?

Il semble qu'il n'y ait aucun moyen d'y parvenir avec élégance ou dans un nombre raisonnable d'étapes. J'ai essayé des méthodes comme user.getFolders(), Folder.findAll({ include: [User] }), mais Sequelize ne semble pas être capable de comprendre une hiérarchie à trois niveaux.

28
jtschoonhoven

En supposant les relations suivantes:

User.belongsToMany(Team, { through: 'users_teams'});
Team.belongsToMany(User, { through: 'users_teams'});

Folder.belongsToMany(Team, { through: 'teams_folders'});
Team.belongsToMany(Folder, { through: 'teams_folders'});

Vous devriez pouvoir tout charger en une seule fois en utilisant les inclusions imbriquées:

User.findAll({
  include: [
    {
      model: Team, 
      include: [
        Folder
      ]  
    }
  ]
});

Vous semblez déjà sur la bonne voie avec l'exemple que vous avez donné dans votre message :). La seule chose que vous devez changer est qu'au lieu de passer le modèle utilisateur directement dans include, vous passez un objet avec une propriété de modèle et une autre propriété d'inclusion imbriquée

48
Jan Aagaard Meier

Faites attention à ce qui suit:

  • Définissez les relations dansles deux directions
  • Vérifiez que vous avez une clé étrangère, une autre clé dansordre correct
User.belongsToMany(Team, {
  through: 'users_teams',
  foreignKey: 'user_id',
  otherKey: 'team_id'
});

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