【问题标题】:TypeORM OneToMany filter in relations not effect to result关系中的 TypeORM OneToMany 过滤器不影响结果
【发布时间】:2019-12-19 05:09:35
【问题描述】:

我有两张桌子:

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

还有:

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

当我在'categories' 上尝试过滤器时,结果并没有按照我已经按下的键过滤'categories'

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

【问题讨论】:

    标签: node.js postgresql typescript typeorm


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我更愿意尽可能避免使用查询生成器。

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

      假设我们有两个实体——UserRole,用户属于一个角色,角色有很多用户:

      @Entity()
      export class User {
        name: string;
      
        @ManyToOne(() => Role, role => role.users)
        role: Role;
      }
      
      @Entity()
      export class Role {
        @OneToMany(() => User, user => user.role)
        users: User[];
      }
      

      现在我们可以调用EntityManager 或存储库的findOne()/find() 方法:

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

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

      【讨论】:

      • 您能澄清一下ab 指的是什么吗?
      猜你喜欢
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 2021-02-20
      • 2021-02-20
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多