タイプORMアクティビティの使用-ログモード


開始します。


TypeORMを使用する方法はdata-mapper, active-recodeモードがあります.この記事ではActive Recodeを紹介しています.

Active Recodeモードを使用する理由


現在進行中のプロジェクトは規模が大きく、複雑ではないため、Active Recordモードを使用して迅速に開発し、その後、Active Recordモードを使用して、再構築中にデータ・マッパ・モードが必要な場合に移行します.

Active Recordとは?


各エンティティ定義のクエリー・メソッドを使用して、データベース内のエンティティ・オブジェクトのモードにアクセスします.エンティティファイルは、find、saveなどの基本機能を提供するBaseEntityを継承する必要があります.
  • BaseEntityは、repositoryのすべての標準機能を有するため、repository, EntityManagerを使用する必要はない.
  • repositoryはdata-mapperモードで使用されます.
  • TypeORM正式な書類にこのオプションがリストされています.
  • コードの使用


    公式ドキュメントコードを表示するには、ここです。を参照してください.

    entity/mapping.ts

    import {Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, Timestamp, ManyToOne, JoinColumn, OneToMany, BaseEntity} from "typeorm";
    import { Alarm } from './Alarm';
    import {BabySitter} from './BabySitter'
    import {Parent} from './Parent'
    import { WorkDiary } from './WorkDiary';
    
    @Entity()
    export class Mapping extends BaseEntity {
    
        @PrimaryGeneratedColumn()
        mappingId: number;
    
        @CreateDateColumn({})
        createdAt: Timestamp
    
        // 1: 매핑된거 2: 대기 3: 거절
        @Column({default : 2})
        status : number
    
        // mapping(N) <->  baby sitter(1)
        @ManyToOne(
            () => BabySitter, 
            babySitter => babySitter.mapping, { nullable: false, onDelete: 'CASCADE' })
        @JoinColumn({name: "bsId"})
        babySitter : BabySitter
    
        
        // mapping(N) <->  baby parent(1)
        @ManyToOne(
            () => Parent, 
            parent => parent.mapping, { nullable: false, onDelete: 'CASCADE' }
            )
        @JoinColumn({name: "parentId"})
        parent : Parent
    
    
        // Mapping(1) <-> Alarm(N)
        @OneToMany(
            () => Alarm,
            alarm => alarm.mapping,{ nullable: false, onDelete: 'CASCADE' }
        )
        alarm: Alarm[];
    
    
        // Mapping(1) <-> WorkDiary(N)
        @OneToMany(
            () => WorkDiary,
            workDiary => workDiary.mapping,{ nullable: false, onDelete: 'CASCADE' }
        )
        diary: WorkDiary[];
    
        // 부모 ID를 기준으로 매핑되어 있는 보모 정보를 반환
        static async findMappingList(parentId: number) {
            return await this.createQueryBuilder("mapping")
                .leftJoinAndSelect("mapping.babySitter", "babySitter")
                .where("mapping.parentId = :parentId", { parentId: parentId })
                .getMany();
        }
    
    
        // 이미 동일한 요청이 있는 경우 체크하기 위한 함수
        static async checkDuplicate(parentId: number, bsId: number){
    
            return await this.createQueryBuilder("mapping")
                .where("mapping.parentId = :parentId", {parentId:parentId})
                .andWhere("mapping.bsId = :bsId", {bsId:bsId})
                .getMany();
        }
    }
    
  • entityファイルでstaticを使用してクエリーメソッドを定義
  • controllers/mapping.ts

    import { NextFunction, Request, Response } from 'express';
    import { BabySitter } from '../entity/BabySitter';
    import { Mapping } from '../entity/Mapping';
    
    const findParentList = async (req:Request, res: Response, next: NextFunction) => {
        try{
            const bsId : number = +req.params.bsId; 
        
        await BabySitter.findById(bsId)
        const result = await Mapping.findMappingParentList(bsId);
    
        
    }
    
    export default{
        findParentList
    }
    
  • entityファイルで定義された静的クエリー・メソッドデータベースへのアクセス
  • controllers/babysitter.ts

    const inputBSInfo = async (req:Request, res:Response, next:NextFunction) => {
        const {age, gender, region, career} : BsInputInfo = req.body
    
        // req.params.userId -> string이라 number로 변환
        const userId: number = +req.params.userId;
    
        const user = await User.findOne({userId: userId});
    
        const bs = new BabySitter();
        bs.age = age;
        bs.gender = gender;
        bs.region = region;
        bs.career= career;
        bs.user = user;
    
        await bs.save()
    }
  • entityはBaseEntityの機能を継承し、save()を使用してentityオブジェクト
  • を保存します.