SequelizeJS - hasMany to hasMany在同一个表上有一个连接表

时间:2013-09-23 02:15:44

标签: mysql sequelize.js

我的问题很简单:

我有一个名为用户的表格。 这些用户可以有很多联系人。这些联系人是其他用户。

所以我有一个名为 userHasContacts 的表格,其中包含所有者的ID( userID )以及联系人的ID( contactID )。
这两个外键都引用了用户表。

这是我漂亮的图表:

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

在sequelize中,在我的逻辑中,我会写:

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

但似乎它不能以这种方式工作,而且我已经尝试了几种方法来写这种关系......

对我有用的唯一一条线是

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

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

但是我无法在查找查询中加入用户表格(通过Eager loading),它只是返回 userHasContacts 中的数据。

如果有人提示,欢迎你! 谢谢提前!

1 个答案:

答案 0 :(得分:4)

由于您要做的是自我关联,您只需要调用一次hasMany,这将创建一个联结表

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

将userHasContacts表创建为:

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

要查找用户及其联系人,您可以执行以下操作:

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