乐闻世界logo
搜索文章和话题

NestJS 如何插入具有 OneToMany 关系的实体?

8 个月前提问
6 个月前修改
浏览次数46

1个答案

1

当使用 NestJS 与一个类似于TypeORM这样的ORM(对象关系映射)库来处理数据库操作时,可以通过定义恰当的实体关系模型来插入具有OneToMany关系的实体。

以下是如何定义和插入具有OneToMany关系的实体的步骤:

  1. 定义实体模型

    假设我们有两个实体:UserPhoto。每个用户可以有多张照片,所以我们在 User 实体内部定义一个OneToMany关系。

    typescript
    // user.entity.ts import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm'; import { Photo } from './photo.entity'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; // OneToMany关系 @OneToMany(() => Photo, (photo) => photo.user) photos: Photo[]; }

    对应的 Photo 实体会有一个ManyToOne关系回指到 User 实体。

    typescript
    // photo.entity.ts import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm'; import { User } from './user.entity'; @Entity() export class Photo { @PrimaryGeneratedColumn() id: number; @Column() url: string; // ManyToOne关系 @ManyToOne(() => User, (user) => user.photos) user: User; }
  2. 插入实体

    使用TypeORM的Repository API,你可以先创建一个User实例,然后创建多个Photo实例并将它们与User实例相关联。

    typescript
    // some.service.ts import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { User } from './entities/user.entity'; import { Photo } from './entities/photo.entity'; @Injectable() export class SomeService { constructor( @InjectRepository(User) private usersRepository: Repository<User>, @InjectRepository(Photo) private photosRepository: Repository<Photo> ) {} async createUserAndPhotos(name: string, photoUrls: string[]) { // 创建User实例 const user = this.usersRepository.create({ name }); // 持久化User实体 await this.usersRepository.save(user); // 创建Photo实例并关联到User for (const photoUrl of photoUrls) { const photo = this.photosRepository.create({ url: photoUrl, user: user // 关联User }); // 持久化Photo实体 await this.photosRepository.save(photo); } // 返回创建好的User,其中包含关联的Photos return this.usersRepository.findOne({ where: { id: user.id }, relations: ['photos'] }); } }

    在这个例子中,我们首先创建了一个新的 User 实例,然后保存它。接着,我们遍历一组照片URLs来创建 Photo 实例,并将每个 Photo 实例的 user 属性设置为我们刚刚创建的 User 实例。每个 Photo 实例也被保存。最后,我们可能想要检索新创建的 User 实例及其相关的 Photo 实例,我们可以使用 findOne 方法并指定 relations 选项来包含关联的 Photo 实例。

请注意,这里的代码片断需要在 NestJS 服务中运行,这意味着你首先需要设置好你的 NestJS 项目,包括安装TypeORM和数据库驱动,配置模块以注入仓库等。这个过程中,你也应该确保正确处理任何可能发生的异常,例如使用try/catch块或在服务方法中使用合适的错误处理逻辑。

2024年6月29日 12:07 回复

你的答案