Sequelize 一对一模型关系
Sequelize
是一个基于 Promise 的 Node.js ORM,目前支持 Postgres、MySQL、SQLite 和 Microsoft SQL Server。它具有强大的事务支持,关联关系、读取和复制等功能。
数据模型中的表关系一般有三种:一对一、一对多、多对多。Sequelize
为开发者提供了清晰易用的接口来定义关系、进行表之间的操作。本文介绍如何定义一对一的表关系。
基本概念
Source & Target
从基本概念开始,你将会在大多数关联中使用 source 和 target 模型。 假设您正试图在两个模型之间添加关联。这里我们在 User
和 Project
之间添加一个 hasOne
关联。
const User = sequelize.define('User', {
name: Sequelize.STRING,
email: Sequelize.STRING
})
const Project = sequelize.define('Project', {
name: Sequelize.STRING
})
User.hasOne(Project)
User
模型(函数被调用的模型)是 source 。 Project
模型(作为参数传递的模型)是 target 。
BelongsTo
BelongsTo 关联是在 source model 上存在一对一关系的外键的关联。
一个简单的例子是 Player 通过 player 的外键作为 Team 的一部分。
const Player = this.sequelize.define('player', {
/* attributes */})
const Team = this.sequelize.define('team', {
/* attributes */})
Player.belongsTo(Team); // 将向 Player 添加一个 teamId 属性以保存 Team 的主键值
**默认情况下,将从目标模型名称和目标主键名称生成 belongsTo 关系的外键。**默认的样式是 camelCase
,但是如果源模型配置为 underscored: true
,那么将使用字段 snake_case
创建 foreignKey。比如:
const User = this.sequelize.define('user', {
/* attributes */}, {
underscored: true})
const Company = this.sequelize.define('company', {
uuid: {
type: Sequelize.UUID,
primaryKey: true
}
})
User.belongsTo(Company)
//将用字段company_uuid 添加 companyUuid 到 user
此外,默认外键可以用 foreignKey
选项覆盖。 当设置外键选项时,Sequelize 将使用设置的参数值:
const User = this.sequelize.define('user', {
/* attributes */})
const Company = this.sequelize.define('company', {
/* attributes */ })
//将 fk_company 添加到 User
User.belongsTo