当我们使用 Sequelize 和 SQLite 构建 web 应用时,通常需要使用多对多关系来关联两个实体。本文将介绍如何使用 Sequelize 和 SQLite 将多对多表插入关系。
什么是多对多关系?
多对多关系在关系型数据库中是指,两个实体之间存在多对多的关联,原因是一个实体可以同时关联多个其他实体,而多个实体也可以关联同一个实体。
例如,一篇文章可以被多个标签关联,而一个标签也可以被多篇文章关联。这种关系就是多对多关系。
Sequelize 的多对多关系
Sequelize 提供了多对多关系的构建方式,可以通过创建一个连接表来实现多对多关联。连接表是一个包含两个外键的表,连接两个实体的主键,并跟踪这两个实体之间的关系。
在这个连接表中,每个关系都有一个唯一的标识符(通常是自增 ID),两个实体的主键和一些元数据(例如时间戳)。
以下是一个示例多对多关系的连接表,在这个示例中,我们创建了一个名为 user_tags 的表,它链接了 users 表和 tags 表。
CREATE TABLE user_tags ( id SERIAL PRIMARY KEY, userId INTEGER REFERENCES users(id), tagId INTEGER REFERENCES tags(id), createdAt TIMESTAMP NOT NULL DEFAULT NOW(), updatedAt TIMESTAMP NOT NULL DEFAULT NOW() );
在 Sequelize 中,我们可以按照以下方式定义这个多对多关系的连接表:
-- -------------------- ---- ------- ----- ------- - ---------------------------- - --- - ----- ------------------ ----------- ----- -------------- ---- -- ---------- - ----- --------------- ------------- -------------- ---------- ----- -- ---------- - ----- --------------- ------------- -------------- ---------- ----- - --
定义了连接表后,我们需要在 User 和 Tag 模型中定义多对多的关系:
-- -------------------- ---- ------- ----- ---- - ------------------------ - ----- - ----- ----------------- ---------- ------ ------- ---- - -- ----- --- - ----------------------- - ----- - ----- ----------------- ---------- ------ ------- ---- - -- ----------------------- - -------- ------- -- ----------------------- - -------- ------- --
上面的代码实现了双向多对多关系。我们还可以添加其他元数据,例如特定文章和标签之间的关联时间。
-- -------------------- ---- ------- ----- ---------- - ------------------------------- - --- - ----- ------------------ ----------- ----- -------------- ---- -- ---------- - ----- --------------- ------------- -------------- ---------- ----- -- ---------- - ----- --------------- ------------- -------------- ---------- ----- -- ------ ---------------- -- -------------------------- - -------- ---------- -- -------------------------- - -------- ---------- --
如何插入多对多关系?
在上面的例子中,我们已经定义了多个实体之间的关系,但如何在实际情况下将实体插入到连接表中呢?
在 Sequelize 中,我们可以使用 set 方法来将一个实体与多个其他实体关联。以下是一个向 user 和 tag 之间的连接表添加关系的示例:
const user = await User.findOne({ where: { name: 'John' } }) const tag1 = await Tag.findOne({ where: { name: 'tag1' } }) const tag2 = await Tag.findOne({ where: { name: 'tag2' } }) await user.setTags([tag1, tag2])
上面的代码展示了如何将 user 模型与 tags 模型的两个实体关联起来。setTags 方法将 tags 模型的实体数组设置为 user 模型的实例,从而在 user_tags 表中创建两个新的关系。
结论
本文介绍了 Sequelize 和 SQLite 中的多对多关系,并演示了如何定义、创建连接表和将实体插入到连接表中。这些示例代码将帮助您理解多对多关系的实现方式并提供了指导。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66fcdbc1447136260173e96f