typeorm 多对一/一对多数据保存

本文深入探讨了TypeORM中多对一/一对多关系的实现方法,以作品集和图片为例,详细介绍了如何在nestjs+typeorm+mysql环境中设置实体之间的关系,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多对一/一对多是指A包含多个B实例,但是B只包含一个A实例的关系。

以作品集和图片为例:一个作品集可以包含多张图片,一个图片只包含一个作品集

创建实例

  • 实例公共字段: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
  • 第一次写博客,纪念一下,请路过看官多多包涵~~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值