TypeORM(MySQL)查询发票数据时如何通过订单外键获取关联用户数据
报错原因
你遇到的报错核心是Order实体类中未正确配置名为user的关联属性,或者关联属性名拼写与你查询时写的order.user不匹配。
方案一:配置实体关联(推荐)
将三张表的关联配置和以下示例对齐即可:
- User 实体配置
// user.entity.ts import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm'; import { Order } from './order.entity'; @Entity('users') export class User { @PrimaryGeneratedColumn() id: number; // 其余用户字段省略 @OneToMany(() => Order, order => order.user) orders: Order[]; }
- Order 实体配置
// order.entity.ts import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, OneToMany, JoinColumn } from 'typeorm'; import { User } from './user.entity'; import { Invoice } from './invoice.entity'; @Entity('orders') export class Order { @PrimaryGeneratedColumn() id: number; // 其余订单字段省略 // 必须存在user属性,关联User实体 @ManyToOne(() => User, user => user.orders) @JoinColumn({ name: 'user_id' }) // name值对应数据库中orders表关联users表的外键字段名 user: User; @OneToMany(() => Invoice, invoice => invoice.order) invoices: Invoice[]; }
- Invoice 实体配置
// invoice.entity.ts import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm'; import { Order } from './order.entity'; @Entity('invoices') export class Invoice { @PrimaryGeneratedColumn() id: number; // 其余发票字段省略 @ManyToOne(() => Order, order => order.invoices) @JoinColumn({ name: 'order_id' }) // name值对应数据库中invoices表关联orders表的外键字段名 order: Order; }
配置完成后,你原来写的查询代码可以直接正常运行,能同时拿到发票、订单、对应用户数据:
const query = this.createQueryBuilder('invoice'); query.innerJoinAndSelect('invoice.order', 'order'); query.innerJoinAndSelect('order.user', 'user'); // 后续执行getMany/getOne即可
方案二:手动关联表(临时查询用,无需调整实体配置)
如果不想修改实体配置,可以手动指定关联条件完成查询:
const invoices = await this.createQueryBuilder('invoice') .innerJoinAndSelect('invoice.order', 'order') // 手动关联users表,指定关联条件 .innerJoinAndSelect('users', 'user', 'user.id = order.user_id') .getMany();
内容的提问来源于stack exchange,提问作者Dharmik soni
相关产品推荐
相关产品推荐

