多对一/一对多是指A包含多个B实例,但是B只包含一个A实例的关系。
- typeorm文档
- nest + typeorm + mysql
以作品集和图片为例:一个作品集可以包含多张图片,一个图片只包含一个作品集
创建实例
- 实例公共字段:base.entity.ts
import { PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
export abstract class BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@CreateDateColumn()
created_time: Date;
@Column({ length: 100 })
created_by: string;
@UpdateDateColumn()
updated_time: Date;
@Column({ length: 100 })
updated_by: string;
}
- 作品集实例:design.entity.ts
import { Entity, Column, PrimaryGeneratedColumn, OneToMany, Generated } from 'typeorm';
import { BaseEntity } from '../../../common/base/base.entity';
// 图片实例
import { DesignPictureEntity } from '../design-picture/design-picture.entity';
@Entity('design')
export class DesignEntity extends BaseEntity {
@Column({ length: 36})
@Generated('uuid')
uuid: string;
@Column({ length: 50, unique: true })
key: string;
@Column({ length: 50 })
name: string;
@Column({ length: 100 })
memo: string;
@Column({ length: 50 })
type: string;
@Column({ length: 50 })
type_name: string;
@Column()
status: number;
// 一个作品集包含多个图片
@OneToMany(type => DesignPictureEntity, designPictureEntity => designPictureEntity.design)
pictures: DesignPictureEntity[];
}
- 图片实例:design-picture.entity,ts
import { Entity, Column, Generated, OneToOne, JoinColumn, ManyToOne } from 'typeorm';
import { BaseEntity } from '../../../common/base/base.entity';
// 作品集实例
import { DesignEntity } from '../design/design.entity';
@Entity('design_picture')
export class DesignPictureEntity extends BaseEntity {
@Column({ length: 36})
@Generated('uuid')
uuid: string;
// 多张图片只包含一个作品集
@ManyToOne(type => DesignEntity, designEntity => designEntity.pictures)
// 自定义关联id字段名
@JoinColumn({ name: 'design_id' })
design: DesignEntity;
@Column({ length:50, unique: true })
key: string;
@Column({ length:100 })
name: string;
}
保存关系
// 示例代码
const connection = getConnection();
const design = new DesignEntity()
const picture1 = new DesignPictureEntity()
const picture2 = new DesignPictureEntity()
// 方案1:
await connection.manager.save(designPicture1);
await connection.manager.save(designPicture2);
design.pictures = [designPicture1, designPicture2]
await connection.manager.save(design)
// 方案2:
await connection.manager.save(design)
designPicture1.design = design
await connection.manager.save(designPicture1);
designPicture2.design = design
await connection.manager.save(designPicture2);
// 项目代码
const connection = getConnection();
const design = new DesignEntity();
await this.designService.create(design);
pictures.forEach(async pic => {
const designPicture = new DesignPictureEntity();
Object.keys(pic).forEach(key => {
designPicture[key] = pic[key];
});
designPicture.design = design;
await connection.manager.save(designPicture);
});
// 此示例设定的入参结构也是比较适用方案2,
// request.query
{
id,
name,
...,
pictures: [
{...pictures1},
{...pictures2}
]
}
写在最后
- 由于不知道pictures的长度建议采用方案2
- 最开始方案:新增作品时生成作品示例,在此作品下新增图片时同时保存相应外键design_id
- 第一次写博客,纪念一下,请路过看官多多包涵~~~