基于TypeORM、NestJS与PostgreSQL,如何根据carId为CarsColors实体添加新颜色?
解决TypeORM中根据carId添加车辆颜色的问题
首先,咱们先梳理下你代码里的两个关键问题:
- INSERT语句不支持WHERE子句:你在
insert查询构建器里用了.where(),但SQL的INSERT语法本身就没有WHERE部分,所以TypeORM直接忽略了这个条件,导致carId没有被设置。 - 目标实体写错了:你要插入的是
CarsColors实体,但代码里写的是MetaImages,这也是潜在的错误点。
接下来给你几种正确的实现方式:
方式1:直接在values中指定carId数值
这是最简单的方式,直接把目标carId作为数值传入values里:
await getConnection() .createQueryBuilder() .insert() .into(CarsColors) // 这里要写正确的实体 .values([{ color: 'new color', carId: 1 }]) // 直接传入carId的数值 .execute();
方式2:关联Cars实体插入
如果你想严格遵循TypeORM的关联关系,可以先获取对应的Cars实体,再传入:
// 先找到对应的车辆 const targetCar = await getRepository(Cars).findOneBy({ carId: 1 }); await getConnection() .createQueryBuilder() .insert() .into(CarsColors) .values([{ color: 'new color', carId: targetCar }]) // 传入Cars实体对象 .execute();
方式3:使用Repository的save方法(更推荐)
TypeORM的Repository方法更符合ORM的使用习惯,代码更简洁:
const newCarColor = new CarsColors(); newCarColor.color = 'new color'; // 方式3.1:关联实体 newCarColor.carId = await getRepository(Cars).findOneBy({ carId: 1 }); // 方式3.2:直接指定id(如果你的TypeORM配置允许关联字段直接赋值id) // newCarColor.carId = { carId: 1 } as Cars; await getRepository(CarsColors).save(newCarColor);
额外建议:优化实体命名
你的实体定义里有个容易混淆的点:CarsColors里的carId属性其实是关联的Cars实体,但属性名和数据库字段名(carId)一样了,建议把属性名改成car,这样更清晰:
// CarsColors实体修改后 @Entity() export class CarsColors { @PrimaryGeneratedColumn() id: number; @Column({ nullable: true}) color: string; @ManyToOne(() => Cars, cars => cars.carsColors) // 关联到Cars的carsColors字段,修正原代码的关联错误 @JoinColumn({ name: 'carId' }) // 数据库字段名保持carId car: Cars; // 属性名改成car,避免混淆 } // 对应的Cars实体的OneToMany同步修改 @OneToMany(() => CarsColors, c => c.car, { cascade: true }) carsColors: CarsColors[];
这样修改后,代码可读性会高很多,也不容易出错~
内容的提问来源于stack exchange,提问作者Asking
相关产品推荐
相关产品推荐

