反向关系

关系可以是单向的或双向的。目前 PhotoMetadata 和 Photo 之间的关系是单向的。关系的所有者是 PhotoMetadata,而 Photo 对 PhotoMetadata 一无所知。这使得从 Photo 中访问 PhotoMetadata 变得很复杂。要解决这个问题,我们应该在 PhotoMetadata 和 Photo 之间建立双向关系。让我们来修改一下实体:

  1. import { Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn } from "typeorm";
  2. import { Photo } from "./Photo";
  3. @Entity()
  4. export class PhotoMetadata {
  5. /* ... other columns */
  6. @OneToOne(type => Photo, photo => photo.metadata)
  7. @JoinColumn()
  8. photo: Photo;
  9. }
  1. import { Entity, Column, PrimaryGeneratedColumn, OneToOne } from "typeorm";
  2. import { PhotoMetadata } from "./PhotoMetadata";
  3. @Entity()
  4. export class Photo {
  5. /* ... other columns */
  6. @OneToOne(type => PhotoMetadata, photoMetadata => photoMetadata.photo)
  7. metadata: PhotoMetadata;
  8. }

photo => photo.metadata是用来指定反向关系的名称。Photo 类的元数据属性是在 Photo 类中存储 PhotoMetadata 的地方。你可以选择简单地将字符串传递给@OneToOne装饰器,而不是传递返回 photo 属性的函数,例如"metadata"。这种函数类型的方法使我们的重构更容易。

注意,我们应该仅在关系的一侧使用@JoinColumn装饰器。你把这个装饰者放在哪一方将是这段关系的拥有方。关系的拥有方包含数据库中具有外键的列。