如何在TypeORM+Postgres环境下不配置实体关系使用leftJoinAndSelect查询
TypeORM无预配置实体关联的两表JOIN查询实现方案
错误写法原因分析
- 第一种写法问题:仅通过
select('user')指定了返回User实体字段,Join关联的Post字段没有指定返回规则,也没有做实体属性映射,TypeORM不会自动填充未定义的关联字段,因此只会返回User数据。 - 第二种写法问题:
innerJoinAndSelect传入实体属性user.id作为关联目标是错误用法,该方法在无预配置关联时不能直接传入实体字段作为关联项,同时innerJoinAndMap的第一个参数应为映射到结果的属性路径,而非关联键值,因此触发报错。
正确实现方式
场景1:返回嵌套结构(用户实体挂载关联帖子列表)
使用leftJoinAndMapMany(左连接,保留无帖子的用户)或innerJoinAndMapMany(内连接,仅返回有帖子的用户)手动指定字段映射规则,示例代码如下:
// 左连接示例,返回所有用户,每个用户下挂载posts数组存储关联帖子 const result = await createQueryBuilder(User, 'user') // 第一个参数:映射到user实体的posts属性 // 第二个参数:关联的Post实体 // 第三个参数:Post实体的别名 // 第四个参数:关联条件 .leftJoinAndMapMany('user.posts', Post, 'post', 'post.userId = user.id') .getMany();
返回结果结构示例:
[ { "id": 1, "posts": [ {"id": 1, "userId": 1}, {"id": 2, "userId": 1} ] } ]
场景2:返回扁平化结构(每行是用户+帖子的组合)
如果不需要嵌套结构,直接查询所有字段后调用getRawMany返回原始结果即可:
const rawResult = await createQueryBuilder(User, 'user') .leftJoin(Post, 'post', 'post.userId = user.id') // 可直接写select('user.*, post.*')返回所有字段 .select([ 'user.id as userId', 'post.id as postId' // 其他需要的字段 ]) .getRawMany();
内容的提问来源于stack exchange,提问作者user14372603
相关产品推荐
相关产品推荐

