TypeORM多对多关联场景:根据用户ID查询用户所属全部团队
TypeORM 多对多关联查询指定用户所属团队实现方案
1. 确认实体的多对多关联配置
首先要保证两个实体的关联注解配置正确,User 作为关系持有方添加 @JoinTable 注解:
// Team 实体定义 import { Entity, PrimaryGeneratedColumn, Column, ManyToMany } from 'typeorm'; import { User } from './user.entity'; @Entity() export class Team { @PrimaryGeneratedColumn() id: number; @Column() name: string; @ManyToMany(() => User, (user) => user.teams) users: User[]; }
// User 实体定义 import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable } from 'typeorm'; import { Team } from './team.entity'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() username: string; @ManyToMany(() => Team, (team) => team.users) @JoinTable() // 多对多关系必须在其中一方添加该注解,自动生成中间关联表 teams: Team[]; }
2. 三种可行的查询方式
方式1:查询用户时预加载关联团队
适合需要同时获取用户基础信息和所属团队的场景:
// 注入UserRepository后执行 const targetUserId = 1; // 替换为实际要查询的用户ID const user = await userRepository.findOne({ where: { id: targetUserId }, relations: ['teams'], // 声明预加载teams关联字段 }); // 直接取user.teams即可得到该用户的所有所属团队 const userTeams = user.teams;
方式2:直接查询属于指定用户的团队列表
不需要返回用户信息,可直接查询得到团队集合:
// 注入TeamRepository后执行 const targetUserId = 1; const userTeams = await teamRepository .createQueryBuilder('team') .leftJoin('team.users', 'user') .where('user.id = :userId', { userId: targetUserId }) .getMany();
方式3:对已查询到的User实例加载关联团队
如果已经通过其他逻辑拿到了User实体实例,可以单独加载团队关联,避免重复查询用户基础信息:
// 假设已经提前查询得到了user实例 const userTeams = await userRepository .createQueryBuilder() .relation(User, 'teams') .of(user) .loadMany();
内容的提问来源于stack exchange,提问作者Theo Cerutti
相关产品推荐
相关产品推荐

