2013-09-23 1 views
5

Mon problème est assez simple:SequelizeJS - hasMany à hasMany sur la même table avec une table de jointure

Je suis une table nommée utilisateurs. Ces utilisateurs peuvent avoir beaucoup de contacts. Ces contacts sont d'autres utilisateurs.

J'ai une table nommée userHasContacts, avec l'identifiant du propriétaire (userID) et l'identifiant du contact (contactID).
Ces deux clés étrangères référencent utilisateurs table.

Voici mon beau diagramme:

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

En sequelize, dans ma logique, j'écrirait:

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

Mais il semble que cela ne fonctionne pas de cette façon, et il a été 2 heures j'essaye plusieurs manières d'écrire cette relation ...

La seule ligne qui a fonctionné pour moi était

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

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

Mais je ne peux pas rejoindre utilisateurs table de ma requête find (via Eager loading) et il retourne simplement les données à l'intérieur userHasContacts.

Si quelqu'un a un indice, vous êtes les bienvenus!
Merci d'avance!

Répondre

4

Depuis ce que vous essayez de faire est une association d'auto vous suffit d'appeler hasMany une fois, qui va créer une table de jonction

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

qui va créer la table userHasContacts comme:

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

Pour trouver les utilisateurs et leurs contacts, vous pouvez alors faire:

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