求教TypeORM各类Join用法,重点解析leftJoinAndMapOne示例
TypeORM Join 类型解析与
leftJoinAndMapOne 实战示例 先纠正你对基础 Join 类型的理解
leftJoin:左连接的核心作用是建立表关联用于过滤主表数据,默认不会将关联表的字段映射到实体对象中。比如你只想用关联表的条件筛选主表数据,不需要关联表的具体内容,就用它。leftJoinAndSelect:在左连接的基础上,会把关联表的数据自动映射到实体类预先定义的关联属性上。比如你的table1实体里定义了atr1这个关联字段,用这个方法后,查询出的table1对象中atr1属性会被填充关联表的对应数据。
重点讲解 leftJoinAndMapOne 的用法
这个方法的核心是:把关联查询得到的单条结果,映射到主实体的一个自定义属性上——这个属性甚至不需要在实体类里预先定义,适合你需要在查询时临时添加关联数据到实体的场景。
实战示例
假设我们有两个业务实体:
// User 实体 @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; // 实体原本定义的关联:用户的默认资料 @OneToOne(() => Profile) @JoinColumn() defaultProfile: Profile; // 临时映射的属性:用户的最新资料(实体类无需提前声明) latestProfile?: Profile; } // Profile 实体 @Entity() export class Profile { @PrimaryGeneratedColumn() id: number; @Column() bio: string; @Column() createdAt: Date; @ManyToOne(() => User) user: User; }
现在要查询所有用户,同时把每个用户最新创建的Profile映射到User的latestProfile属性上,就可以用leftJoinAndMapOne实现:
const users = await getRepository(User) .createQueryBuilder("user") .leftJoinAndSelect("user.defaultProfile", "defaultProfile") // 使用 leftJoinAndMapOne 映射最新资料到自定义属性 .leftJoinAndMapOne( "user.latestProfile", // 目标:映射到 User 的 latestProfile 属性 (qb) => qb .select("profile.*") .from(Profile, "profile") .where("profile.userId = user.id") .orderBy("profile.createdAt", "DESC") .limit(1), // 确保只取一条最新的记录 "latestProfile" // 关联表的别名 ) .getMany();
查询完成后,每个User对象除了原本的defaultProfile,还会多出latestProfile字段,对应该用户最新创建的资料。
对应你代码片段的用法框架
如果你的场景是直接关联其他表(而非子查询),leftJoinAndMapOne的写法如下:
.leftJoinAndMapOne( "table1.targetProperty", // 主表实体要映射到的自定义属性 "OtherTable", // 要关联的表 "otherAlias", // 关联表的别名 "table1.id = otherAlias.table1Id AND otherAlias.status = 'active'" // 自定义连接条件(可选) )
leftJoinAndMapOne 的适用场景
- 需要将关联表的单条数据映射到主实体的自定义属性(非实体原本定义的关联)
- 需要通过子查询筛选关联数据(比如取最新、最大的一条记录)
- 不想修改实体类定义,临时在查询中添加关联数据映射
内容的提问来源于stack exchange,提问作者Satyam Dwivedi
相关产品推荐
相关产品推荐

