2014-09-17 6 views
22

Ich habe eine Datenbank mit drei Primärtabellen: users, teams und folders verbunden durch zwei Übergangstabellen, users_teams und teams_folders. Es gibt eine Viele-zu-Viele-Beziehung zwischen Benutzern und Teams sowie zwischen Teams und Ordnern (ein Benutzer kann in mehreren Teams arbeiten und Teams können mehrere Ordner besitzen).über mehr Kreuzung Tabellen mit Sequelize

Sequelize macht eine wunderbare Arbeit der Verwaltung der Benutzer-Teams und Teams-Ordner-Beziehung, aber ich kann keine Möglichkeit finden, eine Beziehung zwischen Benutzern und Ordnern herzustellen.

Gibt es eine Möglichkeit, über zwei Junction-Tabellen zu verbinden, ohne auf Raw SQL zurückgreifen zu müssen?

Es scheint keinen Weg zu geben, dies elegant oder in einer vernünftigen Anzahl von Schritten zu erreichen. Ich habe Methoden wie user.getFolders(), Folder.findAll({ include: [User] }) versucht, aber Sequelize scheint nicht in der Lage zu sein, eine Hierarchie mit drei Ebenen zu verstehen.

Antwort

32

Unter der Annahme, die folgenden Beziehungen:

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

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

Sie sollten in der Lage sein, alles auf einmal zu laden, mit geschachtelten beinhalten:

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

Sie scheinen auf dem richtigen Weg mit dem Beispiel bereits zu Ihnen habe in deinem Post gegeben :). Das einzige, was Sie ändern müssen, ist stattdessen das User-Modell in include direkt von vorbei, Sie ein Objekt mit einem Modell Eigenschaft übergeben und ein weiteren verschachtelt ist Eigentum

+2

Peinlicherweise ist das eigentliche Problem, dass ich nicht wusste, dass diese Methode als "eifriges Laden" bezeichnet wurde und diesen Teil der Dokumentation überflogen hatte. Vielen Dank! – jtschoonhoven

+0

Es scheint, dass 'hasMany' mit 1: M-Relationen verwendet werden soll:' N: M-Assoziationen werden von hasMany nicht unterstützt. Verwenden Sie stattdessen "goesToMany" – jmu

+0

Aktualisiert, danke @jmu :) –

3

Achten Sie auf Folgendes:

  • definieren Beziehungen in beide Richtungen
  • prüfen Sie foreignKey, otherKey in richtigen Reihenfolge
User.belongsToMany(Team, { 
    through: 'users_teams', 
    foreignKey: 'user_id', 
    otherKey: 'team_id' 
}); 

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