You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeORM中获取包含多对多关联的全量数据表数据?

解决TypeORM多对多关联查询时关联字段不返回的问题

首先得确保你的多对多实体关联配置是正确的,这是查询能返回关联数据的前提:

1. 确认实体关联配置

在User实体(关联的拥有方)中,需要正确配置@ManyToMany和@JoinTable:

import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable } from 'typeorm';
import { Role } from './role.entity';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  username: string;

  // 多对多关联配置:拥有方必须添加@JoinTable
  @ManyToMany(() => Role, role => role.users)
  @JoinTable()
  roles: Role[];
}

对应的Role实体也要配置反向关联:

import { Entity, PrimaryGeneratedColumn, Column, ManyToMany } from 'typeorm';
import { User } from './user.entity';

@Entity()
export class Role {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @ManyToMany(() => User, user => user.roles)
  users: User[];
}

2. 查询时加载关联数据

TypeORM没有Sequelize那种include: {all: true}的写法,需要显式指定要加载的关联关系,有两种常用方式:

方式一:使用Repository的find方法,通过relations选项指定

直接在find的配置参数里添加relations数组,填入要加载的关联字段名:

const users = await this.usersRepository.find({
  relations: ['roles'],
});

如果需要同时加载多个关联,直接在数组里添加对应字段即可,比如relations: ['roles', 'otherRelation']。

方式二:使用QueryBuilder(更灵活,适合复杂查询)

通过leftJoinAndSelect方法关联并查询关联表的数据:

const users = await this.usersRepository.createQueryBuilder('user')
  .leftJoinAndSelect('user.roles', 'role')
  .getMany();

3. 可选:全局默认加载关联(谨慎使用)

如果希望所有查询User时都自动加载roles,可以在@ManyToMany装饰器中添加eager: true选项,但这种方式会增加所有查询的性能开销,只适合必须全局加载的场景:

@ManyToMany(() => Role, role => role.users, { eager: true })
@JoinTable()
roles: Role[];

内容的提问来源于stack exchange,提问作者nevermind1727

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:39:27