如何用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
相关产品推荐
相关产品推荐

