NestJs TypeORM 保存多对多的优化方式

NestJs TypeORM Optimised way of saving Many-to-Many

我正在尝试将简单的多对多新闻保存到标签,这是我的结构。

有效。但我不喜欢服务中的代码。这似乎不是干净优化的方法。

-- POST正文

{
    "url": "https://link.com",
    "tags" : [2,4]
}

处理这种多对多保存的官方最佳实践方法是什么?

-- news.entity.ts

@ManyToMany(() => Tag, (tag) => tag.news, { cascade: true })
@JoinTable({name : "news_tags"})
tags: Tag[] 

-- tag.entity.ts

@ManyToMany(() => News, (news) => news.tags)
news: News[]

-- createNews.dto.ts

export class CreateNewsDto {
    
    @IsNotEmpty({message: "Url is required"})
    @IsUrl({ message: 'URL is not valid.' })
    url: string;

    tags: [];
}

-- news.service.ts

async createNews(newsDto: CreateNewsDto){
   const tags: Array<Tag> = [];
   newsDto.tags.forEach(async tagId => {
      const tag = await this.tagRepository.findOne(tagId);
      if(!tag) {
           throw new NotFoundException('Tag not found!');
      }
      tags.push(tag);
   });
   const news = await this.newsRepository.save(newsDto);
   news.tags = tags;
   return await this.newsRepository.save(news);
}

-- news.controller.ts

@Post("/create") 
@UsePipes(ValidationPipe)
async createNews(@Body() newsData: CreateNewsDto){
   return await this.newsService.createNews(newsData); 
}

首先,我认为 forEach 不支持异步操作,为了让你的函数性能更好,使用 findByIds 而不是使用循环,方法如下:

  async createNews(newsDto: CreateNewsDto){
   const tags: Array<Tag> = await this.tagRepository.findByIds(newsDto.tags);
   news.tags = tags;
   return await this.newsRepository.save(news);
}