我想基于相关属性查询实体,例如:
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'
答案 0 :(得分:4)
答案 1 :(得分:1)
有一种变通方法,可以根据我最近发现的findOne()
/ find()
方法的关系字段进行过滤。仅在ObjectLiteral
样式的where
中存在过滤相关表字段的问题,而字符串条件则可以正常工作。
假设我们有两个实体– User
和Role
,用户属于一个角色,角色有许多用户:
@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”的孩子。