🐈

TypeORMのトランスフォーム機能のススメ

2021/11/28に公開

概要

TypeORMのtransformer機能を利用した際の備忘録です
これから導入される方や初めて使う方の参考になれば幸いです

やり方

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

master.master.ts
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化します

Prefecture.ts
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を定義します

  @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

参考文献

https://stackoverflow.com/questions/59760551/typeorm-column-value-from-sanitized-other-column-value

https://typeorm.io/#/entities/column-options

最後に

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

GitHubで編集を提案

Discussion