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

Dan*_*tos 9 typeorm

我想根据相关属性查询实体,例如:

const x = await repo.findOne({ name: 'foo', parent: { name: 'foo' }});
Run Code Online (Sandbox Code Playgroud)

但是当我通过其相关查询时它会返回一个空值 parent

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

当我通过parent: {id: X}它查询时。但我必须按它的名字查询。

我应该怎么做才能让这个查询在 TypeORM 中工作

它类似于:

select * from entity internal join parent ... where entity.name = 'foo' and parent.name = 'foo'

Ale*_*ksi 19

find/findOne不允许通过嵌套关系属性进行过滤。去QueryBuilder,而不是喜欢的东西

const x = await repo.createQueryBuilder("foo")
    .innerJoinAndSelect("foo.parent", "parent")
    .where("parent.name = :name", { name })
    .getOne()
Run Code Online (Sandbox Code Playgroud)

在这里检查一个类似的问题。

  • 我认为它已经实施了。请参阅https://github.com/typeorm/typeorm/issues/2707 接受的答案应该更新。 (2认同)

小智 9

我最近发现了一种基于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[];
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以调用或存储库的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
  }
});
Run Code Online (Sandbox Code Playgroud)

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

  • 有谁知道如何说出“qb”属性类型来修复丢失的类型?提前致谢! (2认同)