一对一

一对一是一种 A 只包含一个 B 实例,而 B 也只包含 A 的一个实例的关系。

例如一个用户表和一个用户信息表,用户表中带有一个外键来保存与信息表的关联信息。而一个帐号只能有一个用户信息与之对应。这就是一个典型的一对一关系,其中带有外键的表成为副表,不带外键的表称为主表。

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity()
export class Profile {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  gender: string;

  @Column()
  photo: string;
}

这里我们将@OneToOne 添加到profile属性并将目标关系类型指定为Profile。我们还添加了必需的@JoinColumn,这是必选项并且只能设置在关系的一侧。@JoinColumn设置在哪一方,哪一方的表将包含一个”relation id“和目标实体的外键。

此示例将生成以下表结构:

Profile 实体结构
User实体结构
  • 主表:通常是经常需要操作的表,比如用户表。

  • 外键:即 @JoinColumn() 通常是放在副表里面。

circle-info

@JoinColumn必须仅设置在关系的一侧,并必须设置在数据库表中具有外键的一侧。

下面展示了如何保存此类的关系:

启用 级联 后,你只需 一次调用一次save即可保存此关系。

要加载用户的配置文件,你必须在 FindOptions 中指定关系。

或者使用QueryBuilder你也可以加入他们:

在关系上启用预先加载,你不必指在find命令中指定关系,因为它将始终自动加载。如果你使用QueryBuilder预关系被禁用,则必须使用leftJoinAndSelect来加载关系。

双向关系

关系可以是单向的,也可以是双向的。单向是仅在侧具有关系装饰器的关系。双向是与关系两侧都有装饰器的关系。

在上面,我们创建了一个单向关系。 现在让我们将它改为双向关系:

circle-exclamation

双向关系允许你使用QueryBuilder从双方加入关系:

最后更新于