前回
カスケードを使用して関連オブジェクトを自動的に保存する方法
@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対多のリレーションの作成についてを掘り下げようと思います。
コード
今回のコードは、以下に格納しました。
次
2023/2/21 予定