LoginSignup
1
0

More than 1 year has passed since last update.

TypeORMのtransformerの仕組みが分からなかったので記事を書いたら理解できた話

Last updated at Posted at 2021-11-21

概要

今までは都道府県のデータをDBテーブルに登録して管理していました

しかし、TypeORMのtransformerという仕組みを利用すれば都道府県テーブルをDBで管理する必要が無くなりました!

その方法を導入した職場のエンジニアさんから教えてもらったので備忘録として紹介します

やり方

固定データを管理・操作するマスタークラスを作成します

今回は都道府県ID・都道府県名のみ管理するためinterfaceを定義します constructorで定義したIMaster型を受け取ります

サンプルコード
export class Master {
  private readonly masters: IMaster[]

  constructor(masters: IMaster[]) {
    this.masters = masters
  }

  findNameById(id: number) {
    return this.masters.find((v) => v.id === Number(id))
  }

  findIdByName(name: string) {
    return this.masters.find((v) => v.name === name)
  }
}

export interface IMaster {
  id: number
  name: string
}

都道府県データをIMaster化します

先程定義したImaster型の通り都道府県ID・都道府県名を定義します 固定データを管理するmasterクラスをextends(継承)して親クラスのconstructorを呼び出します(super)

サンプルコード
import { IMaster, Master } from './master.master'

const PREFECTURE: IMaster[] = [
  {
    id: 1,
    name: '北海道',
  },
  {
    id: 2,
    name: '青森県',
  },
  // 省略します
  {
    id: 47,
    name: '沖縄県',
  },
]

class PrefectureMaster extends Master {
  constructor() {
    super(PREFECTURE)
  }
}

export const Prefecture = new PrefectureMaster()

transformerを利用してEntityを定義します

from = 読み込み時にはImaster型から都道府県IDだけ to = 書き込み時にはまず都道府県IDを受け取り該当する都道府県のImaster型をDBに登録します

サンプルコード
  @Column('tinyint', {
    unsigned: true,
    comment: '都道府県ID',
    transformer: {
      from(id: number): IMaster {
        return Prefecture.findNameById(id)
      },
      to(value: IMaster): number {
        return value.id
      },
    },
  })
  prefecture_id: IMaster

参考文献

最後に

読んでいただきありがとうございます。
今回の記事はいかがでしたか?
・こういう記事が読みたい
・こういうところが良かった
・こうした方が良いのではないか
などなど、率直なご意見を募集しております。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0