2013-09-23 7 views
5

mój problem jest dość prosta:SequelizeJS - hasMany do relacjach hasMany na tym samym stole z tabeli łączącej

Mam tabelę o nazwie użytkowników. Użytkownicy ci mogą mieć wiele kontaktów. Te kontakty to inni użytkownicy.

Więc mam tabeli o nazwie userHasContacts, z identyfikatorem właściciela (userid) oraz identyfikator kontaktu (ContactID).
Oba te klucze obce odnoszą się do tabeli użytkowników.

Oto mój piękny schemat:

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

W sequelize moim logiki, chciałbym napisać:

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

Ale wydaje się, że to nie działa w ten sposób, i to było 2 godziny Próbuję różnych sposobów napisania tej relacji ...

Jedyną linią, która zadziałała dla mnie, było

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

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

Ale wtedy nie mogę dołączyć użytkowników stolik w moim zapytaniu znalezienia (poprzez Eager loading) i po prostu zwraca dane wewnątrz userHasContacts.

Jeśli ktoś ma podpowiedź, to zapraszamy!
Dzięki z góry!

Odpowiedz

4

Od czego staramy się robić to stowarzyszenie samo trzeba tylko zadzwonić hasMany raz, co stworzy tabelę junction

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

co stworzy tabelę userHasContacts jak:

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

Aby znaleźć użytkowników i ich kontakty, możesz następnie:

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