TypeORMでEntityを定義する基本知識

6 min read

概要

TypeORMでデータベースのテーブルをマッピングするクラスを作成した際の備忘録です

これから導入される方や初めて使う方の参考になれば幸いです

用語の説明

TypeORMとは

TypeORMは、NodeJS、Browser、Cordova、PhoneGap、Ionic、React Native、NativeScript、Expo、Electronの各プラットフォームで動作し、TypeScriptとJavaScript(ES5, ES6, ES7, ES8)で使用できるORMです

Entityの定義(解説)

今回使用するmoduleとserviceをimportする

Contractor.ts
import {
    Column,
    PrimaryGeneratedColumn,
    CreateDateColumn,
    Timestamp,
    UpdateDateColumn,
    DeleteDateColumn,
    Entity,
    OneToMany,
    OneToOne,
    JoinColumn,
  } from 'typeorm'
サービス 説明
Column テーブルカラム
PrimaryGeneratedColumn 自動増減の主キーカラム
CreateDateColumn データ挿入時に自動で設定されるカラム
Timestamp カラムのデータ型で使用
UpdateDateColumn データ更新時に自動で設定されるカラム
Entity クラスがEntityであることを定義
OneToMany 1対多/多対1の関係を定義するカラム
OneToOne 1対1の関係を定義するカラム
JoinColumn 外部キーを持つカラムを定義する

https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#primarycolumn

1対多・1対1がピントこない方はこちらに目を通してみてください

https://orkhan.gitbook.io/typeorm/docs/many-to-one-one-to-many-relations

https://orkhan.gitbook.io/typeorm/docs/one-to-one-relations

作成するテーブル名を定義する

@Entity('作成したいテーブル名')

Contractor.ts
@Entity('contractors')

主キーを定義します

unsigned:UNSIGNED属性を数値列に付与します(MySQL限定)
comment:カラムの説明
readonly:読み取り専用のカラムに付与します

Contractor.ts
    @PrimaryGeneratedColumn({
      name: 'id',
      unsigned: true,
      type: 'smallint',
      comment: '契約ID',
    })
    readonly id: number

NUllを許容するカラム(Nullable)を定義します

nullable:NULLを許容します
ins_admin_user_id:xxx| null = null :実行時のプロパティがNULLの場合に不一致になるのを防ぐ

Contractor.ts
    @Column('varchar', { comment: '登録者', nullable: true })
    ins_admin_user_id: string | null = null

リレーションを定義します

1対1の関係を定義します
createForeignKeyConstraints:外部キー制約の作成を回避します
persistence:エンティティの保存中に複数の余分なクエリが回避されるため、パフォーマンスの最適化に役立ちます。

Contractor.ts
    @OneToOne(() => Plan, (plan) => plan.contractor, {
      createForeignKeyConstraints: false,
      persistence: false,
    })
    @JoinColumn({
      name: 'plan_id',
      referencedColumnName: 'id',
    })
    readonly plan?: Plan

/*
  // 契約プランのEntity定義
   @OneToOne(() => Contractor, (contractor) => contractor.plan, {
    createForeignKeyConstraints: false,
    persistence: false,
  })
  readonly contractor?: Contractor
*/

https://github.com/typeorm/typeorm/blob/51b2a63d/src/decorator/options/RelationOptions.ts#L59

1対多/多対1の関係を定義します
createForeignKeyConstraints:外部キー制約の作成を回避します
persistence:エンティティの保存中に複数の余分なクエリが回避されるため、パフォーマンスの最適化に役立ちます。

Contractor.ts
    @OneToMany(() => Terminal, (terminal) => terminal.contractor, {
      createForeignKeyConstraints: false,
      persistence: false,
    })
    readonly terminals?: Terminal[]

/*
  // 端末のEntity定義
  @ManyToOne(() => Contractor, (contractor) => contractor.terminals, {
    createForeignKeyConstraints: false,
    persistence: false,
  })
  @JoinColumn({
    name: 'contractor_id',
    referencedColumnName: 'id',
  })
  readonly contractor?: Contractor
*/

constractorを定義します

初期値のあるプロパティを除いてオブジェクトの不変条件を満たすためにconstructorを設定します

Contractor.ts
  constructor(
    name: string,
    terminal_activate_possible_count: number,
    license_period_days: number,
    archive_period_days: number,
    ins_admin_user_id: string | null,
    upd_admin_user_id: string | null,
    delete_admin_user_id: string | null,
    delete_flg: boolean
  ) {
    this.name = name
    this.terminal_activate_possible_count = terminal_activate_possible_count
    this.license_period_days = license_period_days
    this.archive_period_days = archive_period_days
    this.ins_admin_user_id = ins_admin_user_id
    this.upd_admin_user_id = upd_admin_user_id
    this.delete_flg = delete_flg
    this.delete_admin_user_id = delete_admin_user_id
  }

コード全文

Contractor.ts
import {
    Column,
    PrimaryGeneratedColumn,
    CreateDateColumn,
    Timestamp,
    UpdateDateColumn,
    DeleteDateColumn,
    Entity,
    OneToMany,
    OneToOne,
    JoinColumn,
  } from 'typeorm'

  @Entity('contractors')
  export class Contractor {
    @PrimaryGeneratedColumn({
      name: 'id',
      unsigned: true,
      type: 'smallint',
      comment: '契約ID',
    })
    readonly id: number
  
    @Column('varchar', { comment: '会社名' })
    organization_name: string
  
    @CreateDateColumn({ comment: '登録日時' })
    readonly ins_ts?: Timestamp
  
    @Column('varchar', { comment: '登録者', nullable: true })
    ins_admin_user_id: string | null = null
  
    @UpdateDateColumn({ comment: '最終更新日時' })
    readonly upd_ts?: Timestamp
  
    @Column('varchar', { comment: '更新者', nullable: true })
    upd_admin_user_id: string | null = null
  
    @DeleteDateColumn({ comment: '削除日時' })
    readonly delete_ts?: Timestamp
  
    @Column('varchar', { comment: '削除者', nullable: true })
    delete_admin_user_id: string | null = null
    
    @OneToOne(() => Plan, (plan) => plan.contractor, {
      createForeignKeyConstraints: false,
      persistence: false,
    })
    @JoinColumn({
      name: 'plan_id',
      referencedColumnName: 'id',
    })
    readonly plan?: Plan

    @OneToMany(() => Terminal, (terminal) => terminal.contractor, {
      createForeignKeyConstraints: false,
      persistence: false,
    })
    readonly terminals?: Terminal[]
  
    constructor(
      organization_name: string,
      ins_admin_user_id: string | null,
      upd_admin_user_id: string | null,
      delete_admin_user_id: string | null,
      plan_id: number,
    ) {
      this.organization_name = organization_name
      this.ins_admin_user_id = ins_admin_user_id
      this.upd_admin_user_id = upd_admin_user_id
      this.delete_admin_user_id = delete_admin_user_id
      this.plan_id = plan_id
    }
  }

参考文献

https://typeorm.io/#/

https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md

https://tech.bitbank.cc/typeorm-entity-guideline/

最後に

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

Discussion

ログインするとコメントできます