关系中的 Typeorm OneToMany 过滤器不会影响结果

Max*_*anh 5 postgresql node.js typescript typeorm

我有两个表:

@Entity('Reviews')
class Review {
  ...
  @OneToMany((type) => MapCategory, map => map.review)
  public categories: MapCategory[];
}
Run Code Online (Sandbox Code Playgroud)

和:

@Entity('MapCategories')
export class MapCategory {
  ...
  @ManyToOne(type => Review, (review) => review.categories)
  public review: Review;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试过滤“类别”但结果没有过滤“类别”时,请按照我已经推送的键。

const items = await this.reviewRepository.findAndCount({
      relations: ['categories'],
      where: {
        categories: {
           id: 1
        }
      }
    });
Run Code Online (Sandbox Code Playgroud)

Ale*_*ksi 5

我们需要queryBuilder用于这样的情况,因为find不允许过滤关系:

const items = await reviewRepository.createQueryBuilder("review")
    .leftJoinAndSelect("review.categories", "category")
    .where("category.id = :id", { id })
    .getManyAndCount()
Run Code Online (Sandbox Code Playgroud)


小智 5

我更喜欢尽可能避免查询生成器。

\n\n

我最近发现了一种基于findOne()/方法的关系字段进行过滤的解决方法。find()过滤相关表字段的问题仅存在于ObjectLiteral-style where,而字符串条件则完美。

\n\n

假设我们有两个实体 \xe2\x80\x93UserRole,用户属于一个角色,角色有多个用户:

\n\n
@Entity()\nexport class User {\n  name: string;\n\n  @ManyToOne(() => Role, role => role.users)\n  role: Role;\n}\n\n@Entity()\nexport class Role {\n  @OneToMany(() => User, user => user.role)\n  users: User[];\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我们可以调用findOne()/或repositoryfind()的方法:EntityManager

\n\n
roleRepository.find({\n  join: { alias: \'roles\', innerJoin: { users: \'roles.users\' } },\n  where: qb => {\n    qb.where({ // Filter Role fields\n      a: 1,\n      b: 2\n    }).andWhere(\'users.name = :userName\', { userName: \'John Doe\' }); // Filter related field\n  }\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

join如果您已将您的关系标记为热切关系,则可以省略该部分。

\n

  • 您能澄清一下“a”和“b”指的是什么吗? (6认同)