高瀬博道の技術ブログ

高瀬博道の技術ブログです。

TypeORMに入門する - 12

前回

takasehiromichiex.com

カスケードを使用して関連オブジェクトを自動的に保存する方法

@OneToOne デコレータのオプションにカスケードを設定します。

src/entity/Photo.ts
import { Column, Entity, OneToOne, PrimaryGeneratedColumn } from "typeorm";
import { PhotoMetadata } from "./PhotoMetadata";

@Entity()
export class Photo {
  @PrimaryGeneratedColumn()
  id: number;
  @Column({ length: 100 })
  name: string;
  @Column("text")
  description: string;
  @Column()
  filename: string;
  @Column("double")
  views: number;
  @Column()
  isPublished: boolean;
  @OneToOne(() => PhotoMetadata, (photoMetadta) => photoMetadta.photo, {
    cascade: true,
  })
  metadata: PhotoMetadata;
}

データを保存するようにしてみます。

src/index.ts
import { AppDataSource } from "./data-source";
import { Photo } from "./entity/Photo";
import { PhotoMetadata } from "./entity/PhotoMetadata";

AppDataSource.initialize()
  .then(async () => {
    console.log("start...");

    const photo = new Photo();
    photo.name = "photo name";
    photo.description = "photo description";
    photo.filename = "sample_photo.jpg";
    photo.views = 0;
    photo.isPublished = true;

    const metadata = new PhotoMetadata();
    metadata.height = 1000;
    metadata.width = 500;
    metadata.compressed = true;
    metadata.comment = "yeah";
    metadata.orientation = "oriented";

    photo.metadata = metadata;

    const photoRepository = AppDataSource.getRepository(Photo);

    const result = await photoRepository.save(photo);
    console.log(result);
  })
  .catch((error) => {
    console.log(error);
  });

saveが、Photoの一度でよくなっています。

実行すると、以下のようになります。

query: COMMIT
Photo {
  name: 'photo name',
  description: 'photo description',
  filename: 'sample_photo.jpg',
  views: 0,
  isPublished: true,
  metadata: PhotoMetadata {
    height: 1000,
    width: 500,
    compressed: true,
    comment: 'yeah',
    orientation: 'oriented',
    id: 5
  },
  id: 9
}

まとめ

ここまでで、

  • カスケードを使用して関連オブジェクトを自動的に保存する方法について

を学びました。

次回は1対多のリレーションの作成についてを掘り下げようと思います。

コード

今回のコードは、以下に格納しました。

github.com

2023/2/21 予定