TypeORM关联实体操作:能否直接使用ID而非实体实例?
解决方案:直接用ID操作ProductOnWarehouse,无需先获取实体实例
你完全可以直接用ID进行查询或创建操作,不用先查询Product和Warehouse的实体实例,有两种常用方式:
1. 使用数据库外键列名(推荐)
因为你在@JoinColumn里已经指定了外键列名是productId和warehouseId,可以直接在查询或创建时使用这些列名:
查询示例
// 直接用productId和warehouseId作为查询条件 const record = await this.storedProductsRepository.findOneBy({ productId: 1, warehouseId: 2 });
创建示例
要支持这种方式,需要在ProductOnWarehouse实体中显式添加外键字段的定义(和关联属性共存即可):
// 修改ProductOnWarehouse.ts import { Entity, Column, PrimaryGeneratedColumn, ManyToOne, JoinColumn } from "typeorm" import Product from "./Product" import Warehouse from "./Warehouse" @Entity({ name: "ProductOnWarehouse" }) export default class ProductOnWarehouse { @PrimaryGeneratedColumn() id: number // 新增外键字段定义 @Column() productId: number @ManyToOne(() => Product, (product) => product.productOnWarehouses) @JoinColumn({ name: "productId" }) product: Product // 新增外键字段定义 @Column() warehouseId: number @ManyToOne(() => Warehouse, (warehouse) => warehouse.productOnWarehouses) @JoinColumn({ name: "warehouseId" }) warehouse: Warehouse @Column() price: number @Column() amount: number }
之后创建记录时就可以直接赋值ID:
const newStockRecord = this.storedProductsRepository.create({ productId: 1, warehouseId: 2, price: 199.99, amount: 50 }); await this.storedProductsRepository.save(newStockRecord);
2. 使用主键对象(无需修改实体)
如果不想修改实体,也可以直接传入包含主键的对象,TypeORM会自动识别并转换为外键查询:
查询示例
const record = await this.storedProductsRepository.findOneBy({ product: { id: 1 }, warehouse: { id: 2 } });
创建示例
const newStockRecord = this.storedProductsRepository.create({ product: { id: 1 }, warehouse: { id: 2 }, price: 199.99, amount: 50 }); await this.storedProductsRepository.save(newStockRecord);
这两种方式都能避免额外的实体查询操作,提升效率。
内容的提问来源于stack exchange,提问作者Mod diller
相关产品推荐
相关产品推荐

