概要
今までは都道府県のデータを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
参考文献
最後に
読んでいただきありがとうございます。
今回の記事はいかがでしたか?
・こういう記事が読みたい
・こういうところが良かった
・こうした方が良いのではないか
などなど、率直なご意見を募集しております。