Nestjs 如何正确映射 2 tables 与中间 table

Nestjs how to properly map 2 tables with a middle table

我正在使用 Postgres 因为数据库有下一个表:

学生

id: Integer (PK)
name: Text

主题

id: Integer (PK)
name: Text

student_assignation

student_id: Integer (PK)
subject_id: Integer (PK)

那些表没有 Auto-generated PK。 所以,我的实体是:

Student.entity.ts

import { Entity, Column, PrimaryGeneratedColumn, OneToMany, PrimaryColumn } from 'typeorm';
import { student_assignation } from './student_assignation.entity';
import { Subject } from './subject.entity';

@Entity()
export class Student {
  @Column('number')
  @PrimaryColumn()
  id: number;

  @Column('text')
  name: string;

  @OneToMany(type => student_assignation, x => x.subject_id)
  //student_assignations: student_assignation[];
}

好吧,这是我的问题: 我正在尝试将所有主题分配给用户。 在 SQL 术语中,我将其定义为:

SELECT 
    u.id, u.name, r.id, r.name
FROM  
    student u INNER JOIN student_assignation ra
        ON u.id = ra.student_id
    INNER JOIN subject r
        ON r.id = ra.subject_id
WHERE
    u.id = 1

但是目前在nestjs中转换使用,我有这样的关系:

@OneToMany(type => student_assignation, x => x.subject_id)

@ManyToOne(type => subject, x => x.id)

但是,没有检索到任何信息。

您需要多对多关系。查看 TypeOrm 实现 here

您必须在 many-to-many 关系中实现您的实体:

@Entity()
export class Student {
    @Column('number')
    @PrimaryColumn()
    id: number;

    @Column('text')
    name: string;

    @ManyToMany(type => Subject)
    @JoinTable({ name: 'student_assignation' })
    subjects: Subject[];
}


@Entity()
export class Subject {
    @PrimaryColumn()
    id: number;

    @Column()
    name: string;

    @ManyToMany(type => Student)
    students: Student[];
}

要检索具有所有主题的用户:

const user = await User.findOne(USER_ID, { relations: ['subjects'] })
console.log(user.subjects);