高瀬博道の技術ブログ

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

TypeORMに入門する - 8

前回

takasehiromichiex.com

PhotoMetadataの作成

新しいモデルを作成してみます。

src/entity/PhotoMetadata.ts
import { Photo } from "./Photo";

export class PhotoMetadata {
  id: number;
  height: number;
  width: number;
  oriientation: string;
  compressed: boolean;
  comment: string;
  photo: Photo;
}

上記のようなモデルを作成した後に、アノテーションをつけてエンティティにします。

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

@Entity()
export class PhotoMetadata {
  @PrimaryGeneratedColumn()
  id: number;
  @Column("int")
  height: number;
  @Column("int")
  width: number;
  @Column()
  oriientation: string;
  @Column()
  compressed: boolean;
  @Column()
  comment: string;
  photo: Photo;
}

1対1の関係

ここで、1対1の関係になるようにアノテーションをつけます。

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

@Entity()
export class PhotoMetadata {
  @PrimaryGeneratedColumn()
  id: number;
  @Column("int")
  height: number;
  @Column("int")
  width: number;
  @Column()
  oriientation: string;
  @Column()
  compressed: boolean;
  @Column()
  comment: string;
  @OneToOne(() => Photo)
  @JoinColumn()
  photo: Photo;
}

@OneToOne(() => Photo)と、@JoinColumn()を追加しています。

データソースにも追加します。

src/data-source.ts
import "reflect-metadata";
import { DataSource } from "typeorm";
import { Photo } from "./entity/Photo";
import { PhotoMetadata } from "./entity/PhotoMetadata";
import { User } from "./entity/User";

export const AppDataSource = new DataSource({
  type: "mysql",
  host: "localhost",
  port: 3306,
  username: "test",
  password: "test",
  database: "test",
  synchronize: true,
  logging: true,
  entities: [Photo, User, PhotoMetadata],
  migrations: [],
  subscribers: [],
});

この状態でnpm startすると、以下のテーブルが追加されています。

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| photo          |
| photo_metadata |
| user           |
+----------------+
3 rows in set (0.00 sec)

mysql> show columns from photo_metadata;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int          | NO   | PRI | NULL    | auto_increment |
| height       | int          | NO   |     | NULL    |                |
| width        | int          | NO   |     | NULL    |                |
| oriientation | varchar(255) | NO   |     | NULL    |                |
| compressed   | tinyint      | NO   |     | NULL    |                |
| comment      | varchar(255) | NO   |     | NULL    |                |
| photoId      | int          | YES  | UNI | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

まとめ

ここまでで、

  • PhotoMetadataの作成について
  • 1対1の関係について

を学びました。

次回は1対1の関係の保存を掘り下げようと思います。

コード

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

github.com

takasehiromichiex.com