乐闻世界logo
搜索文章和话题

Typeorm 如何在“多对多”表中添加额外的字段?

2 个月前提问
1 个月前修改
浏览次数37

1个答案

1

在TypeORM中,要在多对多关系中添加额外的字段,您需要将其转换为两个“多对一/一对多”的关系,并创建一个显式的中间实体来存储额外的字段。这样做可以让您在关联表中自定义更多信息,而不仅仅是两边的关联ID。

以下是如何实现的步骤和代码示例:

步骤 1: 定义实体

假设我们有两个实体,StudentCourse,它们之间是多对多关系,现在我们需要在关系中添加一个额外的字段 grade 来存储学生的成绩。

首先,我们定义 StudentCourse 实体。

typescript
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable } from "typeorm"; import { CourseRegistration } from "./CourseRegistration"; @Entity() export class Student { @PrimaryGeneratedColumn() id: number; @Column() name: string; @ManyToMany(() => CourseRegistration, courseRegistration => courseRegistration.student) registrations: CourseRegistration[]; } @Entity() export class Course { @PrimaryGeneratedColumn() id: number; @Column() name: string; @ManyToMany(() => CourseRegistration, courseRegistration => courseRegistration.course) registrations: CourseRegistration[]; }

步骤 2: 创建中间实体

然后,我们创建一个中间实体 CourseRegistration 来存储额外的字段和设置关联。

typescript
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm"; import { Student } from "./Student"; import { Course } from "./Course"; @Entity() export class CourseRegistration { @PrimaryGeneratedColumn() id: number; @Column() grade: string; @ManyToOne(() => Student, student => student.registrations) student: Student; @ManyToOne(() => Course, course => course.registrations) course: Course; }

步骤 3: 使用关系

最后,当您需要添加或查询数据时,您可以通过操作 CourseRegistration 实体来管理学生和课程之间的关系以及额外的成绩字段。

例如,添加一条新的注册信息可以如下操作:

typescript
import { getRepository } from "typeorm"; import { Student } from "./Student"; import { Course } from "./Course"; import { CourseRegistration } from "./CourseRegistration"; async function registerStudentToCourse(studentId: number, courseId: number, grade: string) { const studentRepository = getRepository(Student); const courseRepository = getRepository(Course); const registrationRepository = getRepository(CourseRegistration); const student = await studentRepository.findOne(studentId); const course = await courseRepository.findOne(courseId); const registration = new CourseRegistration(); registration.student = student; registration.course = course; registration.grade = grade; await registrationRepository.save(registration); }

这样,您就可以在多对多关系中自由地添加并管理额外的字段了。这种方法提供了更大的灵活性和控制,尤其是当关系中需要存储额外信息时。

2024年7月31日 00:46 回复

你的答案