关系装饰器

@OneToOne

一对一是一种 A 只包含一次 B,而 B 只包含一个 A 的实例关系。我们以UserProfile实体为例。用户只能拥有一个 profile,并且一个 profile 仅由一个用户拥有。例如:

  1. import { Entity, OneToOne, JoinColumn } from "typeorm";
  2. import { Profile } from "./Profile";
  3. @Entity()
  4. export class User {
  5. @OneToOne(type => Profile, profile => profile.user)
  6. @JoinColumn()
  7. profile: Profile;
  8. }

了解有关一对一关系的更多信息。

@ManyToOne

多对一/一对多是 A 包含多个 B 实例,但 B 只包含一个 A 实例的关系。我们以UserPhoto实体为例。User 可以拥有多张 photos,但每张 photo 仅由一位 user 拥有。例如:

  1. import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm";
  2. import { User } from "./User";
  3. @Entity()
  4. export class Photo {
  5. @PrimaryGeneratedColumn()
  6. id: number;
  7. @Column()
  8. url: string;
  9. @ManyToOne(type => User, user => user.photos)
  10. user: User;
  11. }

了解有关多对一/一对多关系的更多信息。

@OneToMany

多对一/一对多是 A 包含多个 B 实例,但 B 只包含一个 A 实例的关系。我们以UserPhoto实体为例。User 可以拥有多张 photos,但每张 photo 仅由一位 user 拥有。例如:

  1. import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm";
  2. import { Photo } from "./Photo";
  3. @Entity()
  4. export class User {
  5. @PrimaryGeneratedColumn()
  6. id: number;
  7. @Column()
  8. name: string;
  9. @OneToMany(type => Photo, photo => photo.user)
  10. photos: Photo[];
  11. }

了解有关 多对一/一对多关系的更多信息。

@ManyToMany

多对多是一种 A 包含多个 B 实例,而 B 包含多个 A 实例的关系。我们以QuestionCategory实体为例。Question 可以有多个 categories,每个 category 可以有多个 questions。例如:

  1. import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable } from "typeorm";
  2. import { Category } from "./Category";
  3. @Entity()
  4. export class Question {
  5. @PrimaryGeneratedColumn()
  6. id: number;
  7. @Column()
  8. title: string;
  9. @Column()
  10. text: string;
  11. @ManyToMany(type => Category)
  12. @JoinTable()
  13. categories: Category[];
  14. }

了解有关 多对多关系的更多信息。

@JoinColumn

定义关系的哪一侧包含具有外键和的联接列允许你自定义联接列名和引用列名。使用外键定义关系的哪一侧包含 join 列,并允许你自定义 join 列名称和引用的列名称。例如:

  1. @Entity()
  2. export class Post {
  3. @ManyToOne(type => Category)
  4. @JoinColumn({
  5. name: "cat_id",
  6. referencedColumnName: "name"
  7. })
  8. category: Category;
  9. }

@JoinTable

用于多对多关系,并描述”junction”表的连接列。Junction 是由 TypeORM 自动创建的一个特殊的独立表,其中列引用了相关实体。

你可以使用@JoinColumn装饰器更改联结表及其引用列中的列名。 还可以更改生成的”junction”表的名称。例如:

  1. @Entity()
  2. export class Post {
  3. @ManyToMany(type => Category)
  4. @JoinTable({
  5. name: "question_categories",
  6. joinColumn: {
  7. name: "question",
  8. referencedColumnName: "id"
  9. },
  10. inverseJoinColumn: {
  11. name: "category",
  12. referencedColumnName: "id"
  13. }
  14. })
  15. categories: Category[];
  16. }

如果目标表具有复合主键,则必须将一组属性发送到@JoinTable装饰器。

@RelationId

将特定关系的 id(或 id)加载到属性中。例如,如果你的Post实体中有一个多对一的category,你可以通过用@RelationId标记一个新属性来获得一个新的类别 id。例如:

  1. @Entity()
  2. export class Post {
  3. @ManyToOne(type => Category)
  4. category: Category;
  5. @RelationId((post: Post) => post.category) // 需要指定目标关系
  6. categoryId: number;
  7. }

此功能适用于所有类型的关系,包括多对多

  1. @Entity()
  2. export class Post {
  3. @ManyToMany(type => Category)
  4. categories: Category[];
  5. @RelationId((post: Post) => post.categories)
  6. categoryIds: number[];
  7. }

Relation id 仅用于表现。链接值时,不会添加/删除/更改基础关系。