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);
}
我正在尝试将简单的多对多新闻保存到标签,这是我的结构。
有效。但我不喜欢服务中的代码。这似乎不是干净优化的方法。
-- 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);
}