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

How to add extra field to "many to many" table in Typeorm?

1个答案

1

In TypeORM, adding extra fields to a many-to-many relationship requires converting it into two 'many-to-one' or 'one-to-many' relationships and creating an explicit join entity to store additional fields. This approach allows you to customize more information in the join table rather than limiting yourself to just the association IDs on both sides.

Here are the steps and code examples to implement this:

Step 1: Define Entities

Assume we have two entities, Student and Course, with a many-to-many relationship. We need to add an extra field grade to store the student's grade.

First, define the Student and Course entities.

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[]; }

Step 2: Create Join Entity

Then, create a join entity CourseRegistration to store the extra fields and establish relationships.

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; }

Step 3: Use Relationships

Finally, when adding or querying data, manage the relationship between students and courses along with the extra grade field by operating on the CourseRegistration entity.

For example, adding a new registration can be implemented as follows:

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); }

This enables you to freely add and manage extra fields within the many-to-many relationship. The approach provides greater flexibility and control, especially when additional information needs to be stored in the relationship.

2024年7月31日 00:46 回复

你的答案