2013-09-23 26 views
5

Vấn đề của tôi là khá đơn giản:SequelizeJS - hasMany để hasMany trên cùng một bảng với một bảng tham gia

Tôi có một bảng tên người dùng. Những người dùng đó có thể có nhiều địa chỉ liên hệ. Những người liên hệ đó là những người dùng khác.

Vì vậy, tôi có một bảng tên userHasContacts, với id của chủ sở hữu (userID), và id của sự tiếp xúc (ContactId).
Cả hai khóa ngoại đều tham chiếu người dùng bảng.

Dưới đây là sơ đồ xinh đẹp của tôi:

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

Trong sequelize, trong logic của tôi, tôi sẽ viết:

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

Nhưng nó có vẻ như nó không hoạt động theo cách này, và nó được 2 giờ Tôi đang thử một số cách để viết mối quan hệ này ...

Dòng duy nhất hoạt động cho tôi là

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

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

Nhưng sau đó tôi không thể tham gia người dùng bảng trong truy vấn tìm tôi (qua Eager loading) và nó chỉ đơn giản trả về dữ liệu bên trong userHasContacts.

Nếu có ai có gợi ý, bạn được hoan nghênh!
Cảm ơn trước!

Trả lời

4

Kể từ những gì bạn đang cố gắng làm là một tự sự liên kết bạn chỉ cần gọi hasMany một lần, mà sẽ tạo ra một bảng ngã ba

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

Mà sẽ tạo ra các bảng userHasContacts như:

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

Để tìm người dùng và người liên hệ của họ, bạn có thể làm:

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