sequelize-typescript的多表查询(一对多)

2,014 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金之路。

sequelize官方的ts支持方式,懂的都懂嗷,不仅定义麻烦的一批,而且不支持开箱即用,这里我强烈推荐seqeulize-typescript插件,使用到了装饰器定义model,直观且好用。

这里我分享一下sequelize-typescript的多表关联和查询,这也是我之前第一次接触sequelize比较头疼的一块,Sequelize 支持标准关联关系: 一对一,一对多,多对多,一对一比较简单,这里我们主要讲一下一对多和多对多。

定义关联

sequelize提供了四种关联类型,两两成对,分别是

  • HasOne 关联类型
  • BelongsTo 关联类型
  • HasMany 关联类型
  • BelongsToMany 关联类型 对应sequelize-typescript的修饰器就是
  • @HasOne
  • @BelongsTo
  • @HasMany
  • @BelongsToMany 一般HasOneBelongsTo组成一对一关系,HasManyBelongsTo组成一对多关系,多对多比较复杂,两张表需要有一张中间表,来记录两张表的数据关系,用到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进行查询