如何在TypeORM实体中创建返回关联列长度的字段并解决报错
问题原因
这个报错的核心原因是查询Sarf实体时没有主动加载关联的candidates字段,导致该字段为undefined,调用length属性时就会抛出异常。
解决方案
方案1:查询时手动关联加载candidates
在调用查询接口时指定加载关联字段,适合只在部分场景需要获取关联数量的场景:
- 使用find方法查询时添加
relations参数:
const sarf = await Sarf.findOne({ where: { id: 1 }, relations: ['candidates'] });
- 使用QueryBuilder查询时调用
leftJoinAndSelect:
const sarf = await dataSource.getRepository(Sarf) .createQueryBuilder('sarf') .leftJoinAndSelect('sarf.candidates', 'candidate') .where('sarf.id = :id', { id: 1 }) .getOne();
方案2:给getter添加兜底逻辑
如果允许在未加载关联时返回默认值0,可以直接修改getter避免报错:
@Expose() get candidateQtd() { // 可选链 + 空值合并,candidates为undefined时返回0 return this.candidates?.length ?? 0; }
方案3:设置关联为自动急加载
如果所有查询Sarf的场景都需要用到candidates关联,可以在@OneToMany注解中开启eager模式,每次查询会自动加载关联:
@OneToMany(() => Candidate, candidate => candidate.sarf, { eager: true }) candidates: Candidate[];
注意:急加载会增加所有Sarf查询的性能开销,关联数据量大时不推荐使用
方案4:直接查询关联计数(性能最优)
如果只需要关联数量不需要关联实体数据,推荐直接查询计数,避免加载大量冗余数据:
const sarf = await dataSource.getRepository(Sarf) .createQueryBuilder('sarf') // 直接统计关联数量映射到candidateQtd字段 .loadRelationCountAndMap('sarf.candidateQtd', 'sarf.candidates') .where('sarf.id = :id', { id: 1 }) .getOne();
这种方式不需要在实体中定义getter,也不需要加载所有Candidate实体,性能最优。
内容的提问来源于stack exchange,提问作者Jhonatan Rocha
相关产品推荐
相关产品推荐

