高瀬博道の技術ブログ

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

TypeORMに入門する - 11

前回

takasehiromichiex.com

オブジェクトとそのリレーションのロード

PhotoとPhotoMetadataを一つのクエリで読み込みます。

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

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

    const photoRepository = AppDataSource.getRepository(Photo);
    const photos = await photoRepository.find({
      relations: {
        metadata: true,
      },
    });
    console.log("photos", photos);
  })
  .catch((error) => {
    console.log(error);
  });

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

photos [
  Photo {
    id: 6,
    name: 'my new photo...',
    description: 'my description...',
    filename: 'my photo name...',
    views: 0,
    isPublished: true,
    metadata: PhotoMetadata {
      id: 3,
      height: 777,
      width: 555,
      oriientation: 'portrait',
      compressed: true,
      comment: 'my comment...'
    }
  },
  Photo {
    id: 7,
    name: 'my new photo...',
    description: 'my description...',
    filename: 'my photo name...',
    views: 0,
    isPublished: true,
    metadata: PhotoMetadata {
      id: 4,
      height: 777,
      width: 555,
      oriientation: 'portrait',
      compressed: true,
      comment: 'my comment...'
    }
  },
...(省略)

findのオプション

findには色々なオプションがあります。

select

    const photos = await photoRepository.find({
      select: ["id", "name"],
    });
photos [
  Photo { id: 2, name: 'my photo' },
  Photo { id: 3, name: 'my photo' },
  Photo { id: 4, name: 'my new photo...' },
  Photo { id: 5, name: 'my new photo...' },
  Photo { id: 6, name: 'my new photo...' },
  Photo { id: 7, name: 'my new photo...' }

relations

    const photos = await photoRepository.find({
      relations: ["metadata"],
    });
  Photo {
    id: 7,
    name: 'my new photo...',
    description: 'my description...',
    filename: 'my photo name...',
    views: 0,
    isPublished: true,
    metadata: PhotoMetadata {
      id: 4,
      height: 777,
      width: 555,
      oriientation: 'portrait',
      compressed: true,
      comment: 'my comment...'
    }
  }

where

    const photos = await photoRepository.find({
      where: {
        id: 7,
      },
    });
photos [
  Photo {
    id: 7,
    name: 'my new photo...',
    description: 'my description...',
    filename: 'my photo name...',
    views: 0,
    isPublished: true
  }
]

where and

    const photos = await photoRepository.find({
      where: {
        id: 7,
        views: 0,
      },
    });
photos [
  Photo {
    id: 7,
    name: 'my new photo...',
    description: 'my description...',
    filename: 'my photo name...',
    views: 0,
    isPublished: true
  }
]

where or

    const photos = await photoRepository.find({
      where: [
        {
          id: 6,
        },
        {
          id: 7,
        },
      ],
    });
photos [
  Photo {
    id: 6,
    name: 'my new photo...',
    description: 'my description...',
    filename: 'my photo name...',
    views: 0,
    isPublished: true
  },
  Photo {
    id: 7,
    name: 'my new photo...',
    description: 'my description...',
    filename: 'my photo name...',
    views: 0,
    isPublished: true
  }
]

まとめ

ここまでで、

  • オブジェクトとそのリレーションのロードについて
  • findのオプションについて

を学びました。

次回はカスケードを使用する方法についてを掘り下げようと思います。

コード

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

github.com

takasehiromichiex.com