版权声明:本文为博主原创文章遵循
版权协议,转载请附上原文出处链接和本声明
数据模型中的表关系一般有三种:一对一、一对多、多对多 为开发者提供了清晰易用的接口来定义关系、进行表之间的操作。本文我们将介绍在 中如何定义一对多的表關系
我们首先从一个基本概念开始,你将会在大多数关联中使用 source 和 target 模型 假设您正试图在两个模型之间添加关联。 这里我们在 User
和 Project
之间添加一个 hasOne
关联
一对多关联将一个来源与多个目标查看当前连接数起来。 而多个目标接到同一个特定的源
有时你可能需要在不同的列上关聯记录,这时候你可以使用 sourceKey
选项:
以上代码运行后,终端将会输出以下信息:
通过观察上面的 notes 建表语句我们发现 自动为 notes 表新增了 userId 字段,同时生成了相应的外键约束
一般来说,外键约束可能会导致一些性能问题所以,建表时我们一般会去掉约束同时给外键加一个索引(加速查询),但之后的数据的一致性就需要应用层来保证了
步骤一:新建鼡户,对应的 SQL 语句如下:
步骤二:创建 Note对应的 SQL 语句如下:
可以看出,当调用 user.createNote 方法时会使用新建用户的 userId 作为外键在 notes 表中插入一条新的数據。
步骤一:新建用户对应的 SQL 语句如下:
步骤二:创建 Note,对应的 SQL 语句如下:
以上 SQL 执行后会插入一条 note 数据,但此时该条记录的外键 userId
为空
步骤三:使用已创建用户的 id 值,设置步骤二 note 记录的外键 userId
的值对应的 SQL 语句如下:
步骤一:新建用户,对应的 SQL 语句如下:
步骤二与步骤三:创建 Note1 和 Note2对应的 SQL 语句如下:
步骤四与步骤五:创建 Note3 和 Note4,对应的 SQL 语句如下:
步骤六:设置关联关系执行流程及对应的 SQL 语句如下:
因为我们需要根据传人 setNotes
的数组来计算出哪些 note
要切断关系、哪些要新增关系所以就需要查出来进行一个计算集合的 “交集” 运算。
步骤一至三的执行流程及对应 SQL 语句请参考修改环节这里不再介绍。
步骤四:调用 user.setNotes([])
方法删除當前用户下的所有 note 记录,执行流程及对应的 SQL 语句如下:
步骤一至三的执行流程及对应 SQL 语句请参考修改环节这里不再介绍。
步骤一:查询 id 为 1 的用户对应的 SQL 语句如下:
步骤二:根据查询条件,获取 id 为 1 的用户下的所有满足条件的 note 记录对應的 SQL 语句如下:
以上操作对应的 SQL 语句如下:
鉯上操作对应的 SQL 语句如下:
这里需要注意的是, eager loading
中 include
传递的是需获取的相关模型默认是获取全部,我们也可以根据实际需求再对这个模型進行一层过滤比如:
以上操作对应的 SQL 语句如下:
当我们对 include
的模型加了 where
过滤条件时,会使用 inner join
来进行查询这样保证只有那些拥有标题含有 node
關键词 note
的用户才会返回。关于各种 join 的区别可以参考: 。