2014-09-17 18 views
22

Mam bazę danych z trzema podstawowymi tabelami: users, teams i folders połączone dwoma tabelami skrzyżowania, users_teams i teams_folders. Istnieje relacja wiele do wielu między użytkownikami i zespołami oraz między zespołami i folderami (użytkownik może być w więcej niż jednym zespole, a zespoły mogą posiadać więcej niż jeden folder).Łączenie wielu tabel skrzyżowań z Sequelize

Sequelize wykonuje wspaniałą pracę polegającą na zarządzaniu relacjami między użytkownikami a zespołami i folderami, ale nie mogę znaleźć sposobu na nawiązanie relacji między użytkownikami i folderami.

Czy istnieje sposób na połączenie dwóch tabel połączeń bez odwoływania się do surowego kodu SQL?

Wydaje się, że nie ma sposobu, aby osiągnąć to elegancko lub w rozsądnej liczbie kroków. Próbowałem metod takich jak user.getFolders(), Folder.findAll({ include: [User] }), ale Sequelize nie wydaje się być w stanie zrozumieć trzy poziomowej hierarchii.

Odpowiedz

32

Zakładając następujące relacje:

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

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

Powinieneś być w stanie załadować wszystko za jednym razem przy użyciu zagnieżdżone obejmuje:

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

Wydajesz się być na dobrej drodze już na przykładzie ty podałem w twoim poście :). Jedyną rzeczą, którą trzeba zmienić to zamiast przechodząc modelu użytkownika bezpośrednio w include, musisz przekazać obiekt z właściwością modelu i dalej zagnieżdżony obejmują własność

+2

Kłopotliwe, prawdziwym problemem jest to, że nie zdawałem sobie sprawy, że ta metoda została określona jako "upragnione ładowanie" i przejrzałem tę sekcję dokumentacji. Dzięki! – jtschoonhoven

+0

Wygląda na to, że 'hasMany' ma być używany z relacjami 1: M:' N: M asocjacje nie są obsługiwane z hasMany. Użyj belongsToMany zamiast " – jmu

+0

Zaktualizowany, dzięki @jmu :) –

3

zwrócić uwagę na następujące elementy:

  • kształtowanie stosunków w oba kierunki
  • Sprawdź czy masz ForeignKey, otherKey w odpowiedniej kolejności
User.belongsToMany(Team, { 
    through: 'users_teams', 
    foreignKey: 'user_id', 
    otherKey: 'team_id' 
}); 

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