TypeORM操作PostgreSQL时leftJoinAndMapMany查询返回空结果问题求助
问题根因
你的查询结果为空主要是leftJoinAndMapMany使用错误、关联条件逻辑不匹配两个问题导致的:
leftJoinAndMapMany第一个参数需要指定关联结果挂载到父实体的属性名,你填写的user.id、post.id都是实体主键字段,关联的帖子、关注关系数据没有正确挂载到返回的User实体属性上,自然返回空结构。- Follow表的关联条件逻辑错误:Follow表的
userId对应关注者ID,followeeId对应被关注者ID,你当前Join条件写的follow.userId = user.id是把当前查询的用户(帖子作者)当成了关注者,和后续过滤逻辑完全冲突,导致没有匹配的关联数据。
修正后的查询代码
// queryTest.ts data = await getRepository(User) .createQueryBuilder('user') // 把用户发布的帖子挂载到user.posts属性上 .leftJoinAndMapMany('user.posts', Post, 'post', 'post.userId = user.id') // 关联你和帖子作者的关注关系,挂载到post.myFollowRelation属性上 .leftJoinAndMapMany( 'post.myFollowRelation', Follow, 'follow', // 关联条件:被关注者是帖子作者,关注者是你自己 'follow.followeeId = user.id AND follow.userId = :myId', { myId: user.id } ) // 过滤仅关注者可见的帖子,且你确实关注了作者 .where('post.publicScope = :follower', { follower: 'Follower' }) // 排除你没关注的作者发的仅粉丝可见帖 .andWhere('follow.id IS NOT NULL') .getMany()
执行后返回的user.posts字段就会包含你关注的用户发布的所有仅粉丝可见的帖子,post.myFollowRelation会携带对应的关注关系数据。
实体关联优化建议
不需要单独拆分Follower、Followee实体,可以直接在User实体中配置自引用的多对多关联,通过Follow表作为中间表,后续查询可以直接用TypeORM的关联查询API,不需要手动写Join逻辑:
// User.entity.ts @Entity() export class User { @PrimaryGeneratedColumn() id: number; // 我关注的人 @ManyToMany(() => User, user => user.followers) @JoinTable({ name: 'follow', joinColumn: { name: 'userId', referencedColumnName: 'id' }, inverseJoinColumn: { name: 'followeeId', referencedColumnName: 'id' } }) followees: User[]; // 关注我的人 @ManyToMany(() => User, user => user.followees) followers: User[]; @OneToMany(() => Post, post => post.user) posts: Post[]; }
配置完成后可以直接用relation属性关联查询,代码会更简洁。
内容的提问来源于stack exchange,提问作者user14372603
相关产品推荐
相关产品推荐

