You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:18:01