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)
我们需要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,而字符串条件则完美。
假设我们有两个实体 \xe2\x80\x93User和Role,用户属于一个角色,角色有多个用户:
@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}\nRun Code Online (Sandbox Code Playgroud)\n\n现在我们可以调用findOne()/或repositoryfind()的方法:EntityManager
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});\nRun Code Online (Sandbox Code Playgroud)\n\njoin如果您已将您的关系标记为热切关系,则可以省略该部分。
| 归档时间: |
|
| 查看次数: |
6312 次 |
| 最近记录: |