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

如何用TypeORM定义含自定义字段的自关联多对多关系实体?

解决方案

当需要给多对多中间表添加自定义字段时,不能再用TypeORM的@ManyToMany直接映射,得把中间表做成独立实体,通过一对多+多对一的双向关联来实现。

1. 完善Relationships实体

给user1和user2添加@ManyToOne装饰器,指定关联的User实体,并设置对应的外键列:

import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from "typeorm";
import { User } from "./User";

@Entity('relationships')
export class Relationships {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  field: number;

  // 映射到User表的外键列user1_id
  @ManyToOne(() => User, user => user.relationshipsAsUser1)
  @JoinColumn({ name: 'user1_id' })
  user1: User;

  // 映射到User表的外键列user2_id
  @ManyToOne(() => User, user => user.relationshipsAsUser2)
  @JoinColumn({ name: 'user2_id' })
  user2: User;
}

2. 修改User实体

把原来的@ManyToMany替换成两个@OneToMany,分别关联Relationships实体的两个反向关联:

import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm";
import { Relationships } from "./Relationships";

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

  @Column()
  name: string;

  // 作为user1的所有关系
  @OneToMany(() => Relationships, relationship => relationship.user1)
  relationshipsAsUser1: Relationships[];

  // 作为user2的所有关系
  @OneToMany(() => Relationships, relationship => relationship.user2)
  relationshipsAsUser2: Relationships[];
}

说明

  • 中间表relationships会自动生成user1_id和user2_id两个外键列,关联user表的id字段
  • 如果需要获取某个用户的所有关联关系,需要在业务逻辑里合并relationshipsAsUser1和relationshipsAsUser2的数据
  • 这种方式支持给中间表添加任意自定义字段(比如示例中的field),同时保留用户之间的关联关系

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:01:18