我的问题很简单:
我有一个名为用户的表格。 这些用户可以有很多联系人。这些联系人是其他用户。
所以我有一个名为 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 中的数据。
如果有人提示,欢迎你! 谢谢提前!
答案 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'}]})