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

多对一/一对多是指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
  • 第一次写博客,纪念一下,请路过看官多多包涵~~~
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TypeORM 中实现多对多关系需要使用到 Entity 的 `@ManyToMany` 装饰器。假设我们有两个 Entity,分别是 `User` 和 `Role`,并且它们之间是多对多的关系,即一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。 首先,我们需要定义一个关联表用于存储 User 和 Role 的关系。这个关联表不需要单独定义,可以在其中一个 Entity 的 `@ManyToMany` 装饰器中指定关联表的名称和字段名。例如,我们可以在 User Entity 中定义如下的关联关系: ```typescript @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @ManyToMany(() => Role, role => role.users) @JoinTable() roles: Role[]; } ``` 这里我们使用了 `@ManyToMany` 装饰器来定义与 Role Entity 的多对多关系,并且指定了关联表的名称和字段名。`@JoinTable` 装饰器用于指定关联表的名称和字段名,如果不指定,TypeORM 会自动生成一个默认的表名和字段名。 接下来,我们需要定义 Role Entity,它与 User Entity 的关系也是多对多的: ```typescript @Entity() export class Role { @PrimaryGeneratedColumn() id: number; @Column() name: string; @ManyToMany(() => User, user => user.roles) users: User[]; } ``` 这里我们同样使用了 `@ManyToMany` 装饰器来定义与 User Entity 的多对多关系,并且指定了关联表的名称和字段名。 一旦我们定义好了多对多关系,我们就可以使用 TypeORM 提供的 Repository API 进行增删改查操作。例如,我们可以通过以下代码向数据库中添加一个用户和一个角色,并将它们关联起来: ```typescript const userRepository = getConnection().getRepository(User); const roleRepository = getConnection().getRepository(Role); // 创建一个用户和一个角色 const user = new User(); user.name = 'Alice'; await userRepository.save(user); const role = new Role(); role.name = 'Admin'; await roleRepository.save(role); // 关联用户和角色 user.roles = [role]; await userRepository.save(user); ``` 这里我们首先通过 `getRepository` 方法获取到 User 和 Role 的 Repository 实例,然后分别创建一个用户和一个角色,并将它们保存数据库中。最后,我们将用户和角色关联起来,保存数据库中。 如果我们想要查询某个用户的所有角色,可以通过以下代码实现: ```typescript const user = await userRepository.findOne(1, { relations: ['roles'] }); console.log(user.roles); ``` 这里我们通过 `findOne` 方法查询到 id 为 1 的用户,并且使用 `relations` 选项指定了需要关联查询的字段。最终输出该用户的所有角色。 如果我们想要删除某个用户的某个角色,可以通过以下代码实现: ```typescript const user = await userRepository.findOne(1, { relations: ['roles'] }); user.roles = user.roles.filter(role => role.id !== 1); await userRepository.save(user); ``` 这里我们首先查询到 id 为 1 的用户,并且获取到该用户的所有角色。然后,我们从该用户的角色列表中过滤掉 id 为 1 的角色,并将修改后的用户保存数据库中。 以上就是 TypeORM 中实现多对多关系的增删改查操作的示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值