2013-09-23 6 views
5

Il mio problema è abbastanza semplice:SequelizeJS - hasMany al hasMany sullo stesso tavolo con un tavolo unirsi

Ho una tabella denominata utenti. Questi utenti possono avere molti contatti. Questi contatti sono altri utenti.

quindi ho una tabella denominata userHasContacts, con l'id del proprietario (userID), e l'id del contatto (contactID ).
Entrambe le chiavi esterne fanno riferimento alla tabella per gli utenti.

Qui è la mia bella figura:

   ---------------- 
______________|____  ____|____ 
| userHasContacts |  | users | 
-------------------  --------- 
| #userID   |  | id | 
| #contactID  |  --------- 
-------------------   | 
       |    | 
       ---------------- 

In sequelize, nella mia logica, avrei scritto:

Users.hasMany(Users, {foreignKey: 'userID', joinTableName: 'userHasContacts'}); 
Users.hasMany(Users, {as: 'Contacts', foreignKey: 'contactID', joinTableName: 'userHasContacts'}); 

ma sembra che non funziona in questo modo, ed è stato 2 ore sto provando diversi modi di scrivere questa relazione ...

l'unica linea che ha funzionato per me è stato

Users.hasMany(UserHasContacts, {foreignKey: 'contactID', joinTableName: 'userHasContacts'}); 

UserHasContacts.findAndCountAll({ where: {userID: id} }).success(function(result) {   
    res.json(result); 
}); 

Ma allora non posso aderire utenti tabella nella mia interrogazione find (via Eager loading) e restituisce semplicemente i dati all'interno userHasContacts.

Se qualcuno ha un suggerimento, siete i benvenuti!
Grazie per l'anticipo!

risposta

4

Dal momento che ciò che si sta cercando di fare è un'associazione di auto è sufficiente chiamare hasMany una volta, che creerà una tabella di incrocio

User.hasMany(User, { as: 'Contacts', joinTableName: 'userHasContacts'}) 

Che creerà la tabella userHasContacts come:

CREATE TABLE IF NOT EXISTS `userHasContacts` (`userId` INTEGER , `ContactsId` INTEGER , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`userId`,`ContactsId`)) ENGINE=InnoDB; 

Per trovare gli utenti ei loro contatti si può quindi fare:

User.find({ where: ..., include: [{model: User, as: 'Contacts'}]})