Typescript TypeORM 创建并保存数据最优方法 NestJS 可选字段批量赋值
方案1:直接使用TypeORM内置的create方法(最推荐)
你完全不需要手动解构和逐个判断赋值,TypeORM的Repository.create()方法本身就支持传入属性对象,会自动将对象中存在的、和实体匹配的属性映射到新创建的实例上,未传入的undefined属性会自动忽略,完全符合你的需求,代码可以简化成:
@EntityRepository(Movie) export class MoviesRepository extends Repository<Movie> { async createMovie(createMovieDto: CreateMovieDto) { // 直接把dto传入create方法即可 const movie = this.create(createMovieDto); try { await this.save(movie); } catch (error) { // 错误处理逻辑 } } }
这个方案的好处是完全不需要写额外的赋值逻辑,后续新增字段也不需要改这段代码,只要dto和实体的字段名保持一致即可。
方案2:手动过滤字段后批量赋值
如果你的场景中dto可能包含实体没有的额外字段,需要严格控制赋值的字段范围,可以用遍历的方式统一处理,避免逐个写if判断:
@EntityRepository(Movie) export class MoviesRepository extends Repository<Movie> { // 提前定义好所有需要赋值的实体字段,写一次后续复用 private readonly MOVIE_FIELDS: Array<keyof Movie> = ['isPublished', 'cinemaRelease', 'title', 'orgTitle' /* 其余字段依次添加 */]; async createMovie(createMovieDto: CreateMovieDto) { const movie = this.create(); // 统一遍历赋值,只把dto中不为undefined的字段赋值给实体 this.MOVIE_FIELDS.forEach(field => { if (createMovieDto[field] !== undefined) { movie[field] = createMovieDto[field]; } }); try { await this.save(movie); } catch (error) { // 错误处理逻辑 } } }
注意这里判断的是!== undefined,而不是直接判断值的真假,避免0、false、''这类合法的假值被误过滤。
方案3:自动读取实体元数据获取字段(不需要手动维护字段列表)
如果不想手动维护字段列表,可以通过TypeORM的元数据API自动读取实体的所有列字段,后续新增/删除实体字段时不需要修改赋值逻辑:
import { getConnection } from 'typeorm'; @EntityRepository(Movie) export class MoviesRepository extends Repository<Movie> { async createMovie(createMovieDto: CreateMovieDto) { const movie = this.create(); // 自动获取Movie实体的所有列字段名 const movieColumns = getConnection() .getMetadata(Movie) .columns .map(col => col.propertyName) as Array<keyof Movie>; movieColumns.forEach(column => { if (createMovieDto[column] !== undefined) { movie[column] = createMovieDto[column]; } }); try { await this.save(movie); } catch (error) { // 错误处理逻辑 } } }
内容的提问来源于stack exchange,提问作者Exo
相关产品推荐
相关产品推荐

