在 Sequelize 中,BelongsToMany 是指两个 model 之间的 N:M 的关系,即 A model 中的一个实例可以对应 B model 中的多个实例,B model 中的一个实例也可以对应 A model 中的多个实例。这个关系通过中间表来实现,而 Sequelize 中的多对多关系需要用到 BelongsToMany。
关系示意图
在这个示意图中,User 与 Group 是 N:M 的关系,中间的 user_groups 表即为中间表。
首先定义模型
在示例中,我们定义了 User 和 Group 两个模型,并且建立了中间表 user_groups(通过 belongsToMany 语法实现):
-- -------------------- ---- ------- ----- ---- - ------------------------ - ----- ---------------- --- ----- ----- - ------------------------- - ----- ---------------- --- ----- ---------- - -------------------------------- ------------------------- - -------- ------------- --- ------------------------- - -------- ------------- ---
这里通过 belongsToMany 来定义 User 与 Group 之间的 N:M 关系,需要通过 through 指定中间表的名称,这里我们指定了 user_groups。
操作关系
Sequelize 中的 BelongsToMany 关系操作相对比较复杂,但是也非常实用,接下来我们将详细讲解如何操作该关系。
创建实例
User.create({ name: 'Alice' }).then(user => { return Group.create({ name: 'Admins' }).then(group => { return user.addGroup(group); }); });
这个示例中,我们创建一个名为 Alice 的用户,并创建一个名为 Admins 的组,然后将 Alice 添加到 Admins 组中,这是通过 user.addGroup 方法实现的。
在中间表 user_groups 中,将会生成类似于以下的一条记录:
id | user_id | group_id | createdAt | updatedAt |
---|---|---|---|---|
1 | 1 | 1 | 2019-09-11 12:00:00.123 +00:00 | 2019-09-11 12:00:00.123 +00:00 |
其中,user_id 对应的是 User 表的 id,group_id 对应的是 Group 表的 id,createdAt 和 updatedAt 分别对应的是记录的创建时间和修改时间。
查询实例
User.findOne({ where: { name: 'Alice' } }).then(user => { return user.getGroups(); });
这个示例中,我们通过 User 模型的 findOne 方法找到了名称为 Alice 的用户,然后通过 getGroups 方法查询该用户所属的组。
根据条件查询实例
User.findOne({ where: { name: 'Alice' } }).then(user => { return user.getGroups({ where: { name: 'Admins' } }); });
这个示例中,我们根据 User 模型的 findOne 方法找到了名称为 Alice 的用户,然后通过 getGroups 方法查询该用户所属的组,并且我们只查询了名为 Admins 的组。
添加实例到关联
User.findOne({ where: { name: 'Alice' } }).then(user => { return Group.findOne({ where: { name: 'Admins' } }).then(group => { return user.addGroup(group); }); });
这个示例中,我们通过 User 模型的 findOne 方法找到了名称为 Alice 的用户,然后通过 Group 模型的 findOne 方法找到了名为 Admins 的组,接着通过 addGroup 方法将 Alice 添加到 Admins 组中。
从关联中删除实例
User.findOne({ where: { name: 'Alice' } }).then(user => { return Group.findOne({ where: { name: 'Admins' } }).then(group => { return user.removeGroup(group); }); });
这个示例中,我们通过 User 模型的 findOne 方法找到了名称为 Alice 的用户,然后通过 Group 模型的 findOne 方法找到了名为 Admins 的组,接着通过 removeGroup 方法将 Alice 从 Admins 组中删除。
总结
在 Sequelize 中通过 BelongsToMany 实现多对多关系在实际开发中非常实用,通过本文详细的教程,你已经能够在实际开发中使用 BelongsToMany 来操作 N:M 的关系模型。
完整示例代码:https://github.com/demopark/sequelize-doc-cn/blob/master/belongs-to-many.md
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651d352895b1f8cacd4bc632