🐈

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

2021/11/28に公開

概要

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

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

Contractor.ts
@Entity('contractors')

主キーを定義します

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

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

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

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

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

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

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/

最後に

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

GitHubで編集を提案

Discussion