使用 NestJS 和 TypeORM,我可以将 ID 传递给@ManyToOne关系吗?

With NestJS and TypeORM, can I get away with passing an ID to a @ManyToOne relation?

提问人:Dave 提问时间:10/20/2023 更新时间:10/20/2023 访问量:26

问:

我正在使用 NestJS 10 和 typeorm 0.3.17。我有这个实体......

@Entity()
export class Card {
    @PrimaryGeneratedColumn('uuid')
    id: string;
  
    @ManyToOne(type => User)
    @JoinColumn({name: 'owner_id', referencedColumnName: 'id'})
    author: User;

    ...
}

及其核心 DTO ...

export class CreateCardDto {
    author: User,
    category: Occasion;
    title: string;
    frontImg: Buffer;
    frontImgAltText: string;
    backImg: Buffer;
    backImgAltText: string;
}

我有一个控制器方法,我根据请求对象中存储的内容设置我的用户......

  @Post()
  async create(@Req() req: Request, @Body() createCardDto: CreateCardDto) {
    const userId = req.user['sub'];
    const user = await this.usersService.findById(userId);
    createCardDto.author = user;
    return this.cardsService.create(createCardDto);
  }

然后将对象保存在服务方法中......

  async create(createCardDto: CreateCardDto): Promise<Card> {
    return this.cardRepository.save(createCardDto);
  }

我想知道的是,在控制器方法中,我使用 ID 查找用户对象

const user = await this.usersService.findById(userId);

但这似乎有点浪费,因为我只需要将 ID 保存在我的目标对象中,但由于“@ManyToOne”关系,我在实体中定义了一个“User”对象。有没有更有效的方法可以避免我进行不必要的数据库查找调用?

nestjs typeorm 关系 多对一

评论


答:

0赞 Hai Alison 10/20/2023 #1

您只需使用:并保存它createCardDto.author = { id: userId }

评论

0赞 Hai Alison 10/20/2023
但您应该首先找到 OneByOrFail,以防止在数据库中不存在 userId 时发生关系冲突
0赞 Dave 10/22/2023
问一个愚蠢的问题——如果我有一个 PostGres 约束“FOREIGN KEY (author_id) REFERENCES ”user“(id)”,为什么我需要这样做?如果用户 ID 不存在,这将导致 INSERT 失败,不是吗?