首页 > 解决方案 > 如何在typeorm的多对多关系中查询额外字段

问题描述

我有一个像这样的用户实体

@Entity()
export class User extends BaseEntity {
  @OneToMany(() => UserLikePost, (userLikePost) => userLikePost.post)
  likedPosts: UserLikePost[];
}

并像这样发布实体

@Entity()
export class Post extends BaseEntity {
  @ManyToMany(() => User, (user) => user.likedPosts)
  likedUsers: User[];
}

像这样桥接实体

@Entity()
export class UserLikePost extends BaseEntity {
  static random() {}

  @Column({
    type: 'boolean',
  })
  isLike: boolean;

  @ManyToOne(() => User, (user) => user.likedPosts)
  user: User;

  @ManyToOne(() => Post, (post) => post.likedUsers)
  post: Post;
}

所以基本上我在用户和帖子之间有一个桥梁实体,它存储了决定用户是否喜欢帖子的 isLike 列。

列表查询工作正常,例如我可以做

postRepository.find({
  relation: ['likedUsers']
})

我得到了相应的 UserLikePosts 列表。

但是,我真正想做的是以任何顺序获取帖子列表,并为每个帖子添加一个布尔字段,以显示特定用户是否喜欢该帖子。

现在我可以加载所有 UserLikePost 行并过滤用户是否存在于列表中,但这似乎是对内存的巨大浪费。我希望查询在数据库中运行,并且只返回布尔结果,无论喜欢的用户是否存在于目标帖子的 UserLikePost 表中。

如何使用 typeorm 执行此查询?

标签: typeorm

解决方案


如果您想获取特定用户喜欢的所有帖子,您可以使用嵌套位置,即

userLikePostRepository.find({
   where: {
     isLike: true,
     user: {
       id: <userId>,
     },
   },
   relation: ['post']
})

推荐阅读