我的问题很简单:
我有一个名为users的表.
这些用户可以有很多联系人.这些联系人是其他用户.
所以我有一个名为userHasContacts的表,其中包含所有者的id(userID)和联系人的id(contactID).
这两个外键都引用用户表.
这是我漂亮的图表:
----------------
______________|____ ____|____
| userHasContacts | | users |
------------------- ---------
| #userID | | id |
| #contactID | ---------
------------------- |
| |
----------------
@H_404_15@
在sequelize中,在我的逻辑中,我会写:
Users.hasMany(Users,{foreignKey: 'userID',joinTableName: 'userHasContacts'} );
Users.hasMany(Users,{as: 'Contacts',foreignKey: 'contactID',joinTableName: 'userHasContacts'} );
@H_404_15@
但似乎它不能以这种方式工作,而且我已经尝试了几种方式来编写这种关系…
对我有用的唯一一条线是
Users.hasMany(UserHasContacts,{foreignKey: 'contactID',joinTableName: 'userHasContacts'} );
UserHasContacts.findAndCountAll({ where: {userID: id} }).success( function(result) {
res.json(result);
});
@H_404_15@
但后来我无法在查找查询中加入用户表(通过Eager loading),它只返回userHasContacts内的数据.
如果有人有提示,欢迎你!
谢谢提前!
最佳答案
因为你要做的是一个自我关联,你只需要调用一次hasMany,这将创建一个联结表
User.hasMany(User,{ as: 'Contacts',joinTableName: 'userHasContacts'})
@H_404_15@
这将创建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;
@H_404_15@
要查找用户及其联系人,您可以执行以下操作:
User.find({ where: ...,include: [{model: User,as: 'Contacts'}]})
@H_404_15@