如何使用TypeORM从三张互相关联的表中一次性查询所需数据
你可以通过TypeORM自带的关联查询能力实现单次请求拉取三层关联数据,有两种常用实现方式:
方案1:使用Repository的find API(写法最简单)
直接在relations参数里嵌套指定要加载的关联层级即可,返回结构完全匹配你需要的嵌套格式:
import { dataSource } from '你的数据源配置文件路径'; // 初始化User仓库 const userRepository = dataSource.getRepository(User); // 执行查询 const result = await userRepository.find({ // 筛选指定ownerId的用户,可根据你的需求调整过滤条件 where: { ownerId: 你要查询的目标ownerId }, // 嵌套指定要加载的关联 relations: { role: { permissions: true } }, // 可选:过滤返回字段,避免返回密码等敏感信息 select: { id: true, firstName: true, lastName: true, login: true, ownerId: true } });
方案2:使用QueryBuilder(适合复杂查询场景)
如果后续需要加更复杂的过滤、排序、聚合逻辑,可以用QueryBuilder实现:
const result = await userRepository .createQueryBuilder('user') // 关联加载用户对应的角色 .leftJoinAndSelect('user.role', 'role') // 关联加载角色对应的权限 .leftJoinAndSelect('role.permissions', 'permission') // 按ownerId过滤用户 .where('user.ownerId = :ownerId', { ownerId: 你要查询的目标ownerId }) .getMany();
关联关系注意事项
你当前的实体定义中,User侧配置了和Role的@OneToOne关联,但Role侧配置的是@ManyToOne指向User,两边的关联类型不匹配。如果你的业务确实是一个用户对应一个角色,建议将Role实体中的user关联调整为@OneToOne,避免查询结果出现异常:
// Role实体调整后的关联配置 @OneToOne(() => User, (user) => user.role) @JoinColumn() user: User | null;
内容的提问来源于stack exchange,提问作者Oleg Ovcharenko
相关产品推荐
相关产品推荐

