TypeORM,基于关系属性的查询实体

时间:2019-08-25 15:58:18

标签: typeorm

我想基于相关属性查询实体,例如:

const x = await repo.findOne({ name: 'foo', parent: { name: 'foo' }});

但是当我通过与其相关的parent

进行查询时,它返回空值。

我已经添加了relations: ['parent'],已经将关系设置为{eager:true}

当我通过parent: {id: X}查询时,它可以工作。但我必须按名称查询。

如何使此查询在TypeORM中工作

这类似于:

从实体内部联接父对象中选择* ...其中entity.name ='foo'和parent.name ='foo'

3 个答案:

答案 0 :(得分:4)

0 2 2 4 4 4 6 6 6 6 / find不允许按嵌套关系属性进行过滤。选择findOne代替

QueryBuilder

检查here是否有类似问题。

答案 1 :(得分:1)

有一种变通方法,可以根据我最近发现的findOne() / find()方法的关系字段进行过滤。仅在ObjectLiteral样式的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[];
}

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

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部分。

答案 2 :(得分:0)

我建议先在父级中获取 id 的列表。

const searchTerm = 'foo'
const parents = await parentRepo.find({name:searchTerm})
const parentIdList = parents.map(parent=>parent.id)
const x = await repo.find({ where:[{name: searchTerm}, {parent: In(parentIdList)}]});

这将给你所有名字为“foo”或父母名字为“foo”的孩子。