2014-09-17 14 views
22

Ho un database con tre tabelle principali: users, teams, e folders uniti da due tavoli di giunzione, users_teams e teams_folders. Esiste una relazione molti-a-molti tra utenti e team e tra team e cartelle (un utente può trovarsi in più di un team e i team possono possedere più di una cartella).Registrati su più tavoli di giunzione con Sequelize

Sequelize fa un ottimo lavoro di gestione della relazione tra team utente e team-cartella, ma non riesco a trovare alcun modo per stabilire una relazione tra utenti e cartelle.

C'è un modo per unire due tabelle di giunzione senza ricorrere a SQL raw?

Non sembra esserci alcun modo per eseguire questo elegantemente o in un numero ragionevole di passaggi. Ho provato metodi come user.getFolders(), Folder.findAll({ include: [User] }), ma Sequelize non sembra in grado di comprendere una gerarchia a tre livelli.

risposta

32

Assumendo le seguenti relazioni:

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

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

Si dovrebbe essere in grado di caricare tutto in un colpo solo utilizzando nidificato include:

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

ti sembra di essere sulla strada giusta già con l'esempio che hai dato nel tuo post :). L'unica cosa che devi cambiare è invece di passare al modello d'uso direttamente in include, si passa un oggetto con una proprietà del modello e una proprietà un'ulteriore nidificato includere

+2

In modo imbarazzante, il vero problema è che non mi ero reso conto che questo metodo era denominato "caricamento ansioso" e che avevo sfogliato quella sezione della documentazione. Grazie! – jtschoonhoven

+0

Sembra che 'hasMany' debba essere usato con le relazioni 1: M:' Le associazioni N: M non sono supportate con hasMany. Uso appartiene a qualcuno invece' – jmu

+0

Aggiornato, grazie @ jmu :) –

3

Prestare attenzione al seguente:

  • Definire relazioni in entrambe le direzioni
  • Controllare avete ForeignKey, otherKey in nell'ordine corretto
User.belongsToMany(Team, { 
    through: 'users_teams', 
    foreignKey: 'user_id', 
    otherKey: 'team_id' 
}); 

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