TypeORM延迟关联疑问:查询返回对象是否含延迟关联getter?
解答
好问题!我来帮你理清楚TypeORM里延迟加载的逻辑,针对你的Issue实体场景结论很明确:只有当你在@ManyToOne关联装饰器里显式开启lazy: true配置时,通过findOne/find返回的Issue实体才会具备延迟加载关联的getter/ Promise属性,否则是没有的。
下面分两种情况详细说明:
1. 开启延迟加载的正确姿势
如果你的Issue实体关联配置加上lazy: true,像这样:
@Entity() export class Issue { @ManyToOne( type => User, user => user.createdIssues, { onDelete: "CASCADE", lazy: true // 关键:开启延迟加载 } ) user: Promise<User>; // 注意类型要声明为Promise<User> // 其他实体字段... }
这时候,当你用findOne获取Issue后,就完全可以像你之前的Question示例那样,通过await触发延迟加载:
const issue = await connection.getRepository(Issue).findOne(1); const user = await issue.user; // 这里会自动触发数据库查询,加载关联的User
2. 未开启延迟加载的情况(你当前的代码状态)
如果你的@ManyToOne没加lazy: true,那默认是不会有延迟加载getter的:
- 直接查询出来的
issue.user会是undefined或者null,不会自动加载关联实体 - 要是想获取关联的
User,得主动通过以下方式加载:- 用
relations选项一次性加载:const issue = await connection.getRepository(Issue).findOne(1, { relations: ["user"] }); // 此时issue.user直接就是User实体,不用await - 用QueryBuilder做关联查询(更灵活):
const issue = await connection.getRepository(Issue) .createQueryBuilder("issue") .leftJoinAndSelect("issue.user", "user") .where("issue.id = :id", { id: 1 }) .getOne();
- 用
额外提醒
- 只有TypeORM从数据库查询出来的实体(被EntityManager管理的实例)才有延迟加载能力,你手动
new出来的Issue实例是没有这个特性的。 - 开启
lazy: true后,记得把关联属性的类型声明为Promise<T>,这样TypeScript才能正确做类型检查,避免报错。
内容的提问来源于stack exchange,提问作者lorefnon
相关产品推荐
相关产品推荐

