TypeORM关联字段为何显示undefined?如何获取外键ID?
解决TypeORM查询关联字段显示undefined及获取外键ID的问题
问题原因
你遇到的关联字段user和belong_organization显示undefined,核心原因有两个:
TypeORM默认不自动加载关联实体
TypeORM出于性能优化考虑,执行findOne这类基础查询时,不会自动JOIN关联表,所以关联属性默认不会被填充,只会返回当前实体的基础字段。实体未显式定义外键字段
虽然数据库表中存在userId和belongOrganizationId外键列,但你的Person实体里没有对应的字段定义,所以即使加载了关联实体,也没法直接获取外键ID值(只能从关联实体的id属性间接拿)。
解决方案
1. 让关联字段不再是undefined(加载关联实体)
有两种常用方式可以加载关联关系:
方式一:用relations选项快速加载
修改你的findOne查询,添加relations参数指定要加载的关联:
presult = await prep.findOne({ where: {id}, relations: ['user', 'belong_organization'] // 列出需要加载的关联属性名 })
执行后,presult.user和presult.belong_organization就会被填充为对应的实体对象。
方式二:用QueryBuilder做灵活关联查询
如果需要更复杂的查询逻辑,推荐使用createQueryBuilder:
presult = await prep.createQueryBuilder('person') .leftJoinAndSelect('person.user', 'user') // 关联user表并查询字段 .leftJoinAndSelect('person.belong_organization', 'organization') // 关联organization表 .where('person.id = :id', {id}) .getOne();
2. 直接获取外键ID(无需加载整个关联实体)
如果你只需要userId或belongOrganizationId的值,不需要整个关联实体,可以在Person实体中显式定义外键字段,并关联到对应的关系装饰器:
修改后的Person实体代码:
@Entity({name: 'person'}) export class Person { @PrimaryGeneratedColumn('uuid') id!: string; // 显式定义userId外键字段 @Column({type: 'uuid'}) userId!: string; @OneToOne(() => User) @JoinColumn({name: 'userId'}) // 指定对应数据库的外键列名 user!: User; @Column({ type: "enum", enum: PersonTitle, default: PersonTitle.Blank }) title?: string; @Column({type: 'varchar', default: ''}) first_name!: string; @Column('varchar') last_name!: string; // 显式定义belongOrganizationId外键字段 @Column({type: 'uuid', nullable: true}) belongOrganizationId?: string; @ManyToOne(() => Organization, org => org.people, { nullable: true}) @JoinColumn({name: 'belongOrganizationId'}) // 指定对应数据库的外键列名 belong_organization!: Organization; }
这样修改后,你不需要加载任何关联,直接通过presult.userId和presult.belongOrganizationId就能获取数据库中的外键值了。
内容的提问来源于stack exchange,提问作者user504909
相关产品推荐
相关产品推荐

