TypeORM find方法返回异常数据问题求助
订单关联产品查询异常问题排查与解决
问题背景
编写GET接口从数据库获取订单数据,涉及Order、OrderHaveProducts等实体关联。数据库中orders_have_products表显示订单1关联2个产品、订单2关联1个产品,但执行关联查询后,订单1的products数组为空,订单2的产品数据与数据库不符;直接查询OrderHaveProducts表能得到正确关联数据。
实体定义
Order实体:
@Entity('orders') export class Order extends BaseEntity { @PrimaryGeneratedColumn() id: number; @CreateDateColumn() createdAt: string; @Column() price: number; @ManyToOne(() => Status, (status) => status.order) status: Status; @OneToMany( () => OrderHaveProducts, (OrderHaveProducts) => OrderHaveProducts.product // 此处存在映射错误 ) products: OrderHaveProducts[]; }
OrderHaveProducts实体:
@Entity('orders_have_products') export class OrderHaveProducts extends BaseEntity { @PrimaryGeneratedColumn() id: number; @ManyToOne(() => Order, (order) => order.products) @JoinColumn({ name: 'order_id' }) order: Order; @ManyToOne(() => Product, (product) => product.orders) @JoinColumn({ name: 'product_id' }) product: Product; @ManyToMany(() => Ingredient) @JoinTable({ name: 'ordered_products_have_removed_ingredients', joinColumn: { name: 'ordered_product_id', referencedColumnName: 'id', }, inverseJoinColumn: { name: 'ingredient_id', referencedColumnName: 'id', }, }) removed_ingredients: Ingredient[]; @ManyToMany(() => Ingredient) @JoinTable({ name: 'custom_products_have_ingredients', joinColumn: { name: 'ordered_product_id', referencedColumnName: 'id', }, inverseJoinColumn: { name: 'ingredient_id', referencedColumnName: 'id', }, }) added_ingredients: Ingredient[]; }
异常查询代码
const orders: Order[] = await Order.find({ relations: { status: true, products: { product: true, removed_ingredients: true, added_ingredients: true, }, }, });
问题原因
Order实体中@OneToMany注解的反向映射属性错误:
- 原本应该关联
OrderHaveProducts中的order属性(对应订单外键),但代码中错误写为OrderHaveProducts.product,导致TypeORM构建关联查询时,错误地以产品外键作为关联条件,而非订单外键,最终查询结果完全不符合预期。
解决方案
修正Order实体中@OneToMany的反向映射属性,将OrderHaveProducts.product改为OrderHaveProducts.order:
@Entity('orders') export class Order extends BaseEntity { @PrimaryGeneratedColumn() id: number; @CreateDateColumn() createdAt: string; @Column() price: number; @ManyToOne(() => Status, (status) => status.order) status: Status; @OneToMany( () => OrderHaveProducts, (orderHaveProducts) => orderHaveProducts.order // 修正为正确的反向属性 ) products: OrderHaveProducts[]; }
修正后,原查询代码无需修改,即可正确获取每个订单关联的OrderHaveProducts数据,包括关联的产品、添加/移除的配料信息。
如果需要更灵活的查询控制,也可以使用QueryBuilder方式确保关联正确:
const orders = await getRepository(Order) .createQueryBuilder('order') .leftJoinAndSelect('order.status', 'status') .leftJoinAndSelect('order.products', 'products') .leftJoinAndSelect('products.product', 'product') .leftJoinAndSelect('products.removed_ingredients', 'removed_ingredients') .leftJoinAndSelect('products.added_ingredients', 'added_ingredients') .getMany();
内容的提问来源于stack exchange,提问作者LeRoiAdibou
相关产品推荐
相关产品推荐

