本文已参与「新人创作礼」活动,一起开启掘金之路。
sequelize官方的ts支持方式,懂的都懂嗷,不仅定义麻烦的一批,而且不支持开箱即用,这里我强烈推荐seqeulize-typescript插件,使用到了装饰器定义model,直观且好用。
这里我分享一下sequelize-typescript的多表关联和查询,这也是我之前第一次接触sequelize比较头疼的一块,Sequelize 支持标准关联关系: 一对一,一对多,多对多,一对一比较简单,这里我们主要讲一下一对多和多对多。
定义关联
sequelize提供了四种关联类型,两两成对,分别是
HasOne关联类型BelongsTo关联类型HasMany关联类型BelongsToMany关联类型 对应sequelize-typescript的修饰器就是@HasOne@BelongsTo@HasMany@BelongsToMany一般HasOne与BelongsTo组成一对一关系,HasMany与BelongsTo组成一对多关系,多对多比较复杂,两张表需要有一张中间表,来记录两张表的数据关系,用到BelongsToMany,这里我就不仔细介绍sequelize的原生写法来,直接上typescript。
一对多
关联
首先我们先定义model
import { Table,Column, Model, PrimaryKey, AutoIncrement } from "sequelize-typescript";
@Table
class Comany extends Model {
@PrimaryKey //主键
@AutoIncrement //自增
@Column
id:number
@Column
name:string
}
@Table
class Staff extends Model{
@PrimaryKey
@AutoIncrement
@Column
id:number
@Column
company_id:number
@Column
name:string
}
我们定义了一个公司模型一个员工模型,一个公司可以有很多个员工,一个员工只能属于一个公司,很好理解,这两个model还没有任何关联,现在我们关联上它们
import { Table,Column, Model, PrimaryKey, AutoIncrement, ForeignKey, HasMany, BelongsTo } from "sequelize-typescript";
@Table
class Comany extends Model {
@PrimaryKey //主键
@AutoIncrement //自增
@Column
id:number
@Column
name:string
// 定义关系
@HasMany(() => Staff)
staff:Staff[]
}
@Table
class Staff extends Model{
@PrimaryKey
@AutoIncrement
@Column
id:number
@ForeignKey(() => Comany) //定义company_id为外键
@Column
company_id:number
@Column
name:string
//定义关系
@BelongsTo(() => Comany)
company:Comany
}
这里,我们先通过@ForeignKey定义好staff表关联到comany表的外键,然后通过@BelongsTo和@HasMany将两张表关联起来,这样,我们的基础关联就完成了,接下来是查询。
查询
//查询id为1的公司信息以及其所有的员工信息(员工id和员工姓名)
Comany.findOne({
where:{
id:1
},
include:{
model:Staff,
attributes:['id','name']
}
})
//查询姓名为张三的员工以及其所属的公司信息(公司id和公司名称)
Staff.findOne({
where:{
name:'张三'
},
include:{
model:Comany,
attributes:['id','company_name']
}
})
这里由于使用到了@Table装饰器,我们可以省略new class的过程,直接使用定义好的model进行查询