NestJS&TypeORM:发布请求中的DTO格式

问题描述 投票:1回答:1

我的应用程序中有这些实体。

Category.ts

export class Category {
    @PrimaryGeneratedColumn()
    Id: number

    @Column()
    Name: string

    @OneToMany(type => SubCategory, subcategoy => subcategoy.Category)
    SubCategories: SubCategory[];
}

SubCategory.ts

export class SubCategory {
    @PrimaryGeneratedColumn()
    Id: number

    @Column()
    Name: string

    @ManyToOne(type => Category, category => category.SubCategories)
    @JoinColumn({name: "CategoryId"})
    Category: Category;
}

现在,如果要添加新的子类别,我的DTO格式应该是什么样?我尝试了以下操作,但外键(CategoryId)为NULL。

SubCategoryDto.ts

export class SubCategoryDto {
    Id: number;
    Name: string;
    CategoryId: number;
}

我了解为什么在数据库中CategoryId列的值为空,因为试图将CategoryId转换为Category,但是由于两者的类型不同,因此失败。我可以执行以下操作,但我觉得这样只会使请求数据变大(即使有点)]

export class SubCategoryDto {
    Id: number;
    Name: string;
    Category: CategoryDto; //has the properties of Id and Name
}

那么SubCategoryDto的格式应该是什么?我是否需要通过首先从数据库中获取类别然后创建SubCategory实体来将DTO转换为Entity类?例如:

//request data for new sub-category
{
    Name: "Subcategory 1",
    CategoryId: 1
}

在服务器端

const newSubcategory    = new SubCategory(); //entity class
newSubcategory.Name     = subCategoryDto.Name;
newSubcategory.Category = await this.categoryService.findById(subCategoryDto.CategoryId)
await this.subCategoryService.create(newSubcategory);

但是,如果我这样做,那不是额外的数据库调用吗?处理这种情况的最佳方法是什么?我整天都在搜索互联网,找不到与此相关的内容。我想这是一件很简单的事情,没有人需要问,但是不幸的是,我不确定应该如何处理。任何帮助,将不胜感激。

typescript entity dto nestjs typeorm
1个回答
0
投票

您需要在SubCategory实体中添加CategoryId属性,以允许映射DTO和实体:

export class SubCategory {
@PrimaryGeneratedColumn()
Id: number

@Column()
Name: string

@Column()
CategoryId: number

@ManyToOne(type => Category, category => category.SubCategories)
@JoinColumn({name: "CategoryId"})
Category: Category;

}

TypeORM自动生成该列,但没有“ manual”声明,试图在Date实体中转换DTO的CategoryId,但失败。

© www.soinside.com 2019 - 2024. All rights reserved.