2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TypeORMでEntityを定義するHow-To

Last updated at Posted at 2021-11-21

概要

TypeORMでEntityを定義するHow-Toを社内の勉強会用に作成してみました!

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

TypeORM is 何?

TypeORMは、NodeJS、Browser、Cordova、PhoneGap、Ionic、React Native、NativeScript、Expo、Electronの各プラットフォームで動作し、TypeScriptとJavaScript(ES5, ES6, ES7, ES8)で使用できるORMです。その目的は、常に最新のJavaScript機能をサポートし、いくつかのテーブルを持つ小規模なアプリケーションから、複数のデータベースを持つ大規模なエンタープライズアプリケーションまで、データベースを使用するあらゆる種類のアプリケーションの開発を支援する追加機能を提供することです。

今回使用するモジュールとサービス

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

1対多・1対1がピントこない方はこちらを参照ください

Entityを定義

サンプルコード
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
    }
  }

作成するテーブル名を定義してください

@Entity('contractors')

unsigned:UNSIGNED属性を数値列に付与します(MySQL限定)
comment:カラム名の説明です。誰でもEntityを読めばカラムの役割を理解できるように推奨してます
readonly:読み取り専用のカラムに付与します。自動増減のカラムは書き換えて欲しくないので設定

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

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

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

こちらを参考にさせていただきました

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

    @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
*/

1対多/多対1の関係を定義します
1つのcontractor(契約)は1つ以上の端末(terminal)を申請する仕様とします
createForeignKeyConstraints:外部キー制約の作成を回避します
persistence:エンティティの保存中に複数の余分なクエリが回避されるため、パフォーマンスの最適化に役立ちます。

    @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
*/

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

  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
  }

以上でEntityの定義が完了です!

参考文献

最後に

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

2
1
0

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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?