【초보자용 메모】TypeORM/PostgreSQL 로 One-To-Many relation 를 정의한다

소개



TypeORM을 공부했을 때의 메모입니다.

설정



여기 참조
mkdir sample && cd sample
npx typeorm init --database postgres --express --docker
yarn

One-To-Many relation



한 명의 사용자가 여러 사진 데이터를 연결하는 경우를 생각해보십시오.


Entity 정의



src/entity/User.ts
import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  OneToMany,
  BaseEntity,
} from 'typeorm';
import { Photo } from './Photo';

@Entity()
export class User extends BaseEntity { // extendしないとUser.createメソッドが使えない
  @PrimaryGeneratedColumn()
  readonly id: number;

  @Column()
  name: string;

  @OneToMany((type) => Photo, (photo) => photo.user) // これはフォールドでなく、relationを表現しているだけ
  photos: Photo[];
}

src/entity/Photo.ts
import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  ManyToOne,
  JoinColumn,
  BaseEntity,
} from 'typeorm';
import { User } from './User';

@Entity()
export class Photo extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  url: string;

  @Column()
  userId: number;

  @ManyToOne((type) => User, (user) => user.photos) // relationを表現しているだけで、fieldとはならない
  @JoinColumn({ name: 'userId' }) // userIdがforeignキーとなることを表す。
  user: User;
}

컨트롤러 구현



여기서 UserContoller에서 새로운 요청이 왔을 때의 처리를 예로 생각한다.


src/controller/UserController.ts

...

  async save(request: Request, response: Response, next: NextFunction) {
    const { name, url } = request.body;
    const user = await User.find({ where: { name } });
    if (user.length) {
      //すでにユーザーが登録済の場合
      await Photo.create({ url, userId: user[0].id }).save();
    } else {
      //ユーザーが未登録の場合
      const newUser = await User.create({ name }).save();
      const newPhoto = await Photo.create({ url, userId: newUser.id }).save();
    }

    return await getConnection() // ormconfig.jsonで定義したDBに接続する。今回はpostgresだけだが、複数のDBに接続している場合は、今回接続するDB名を第一引数にを明示する
      .createQueryBuilder(User, 'u') // 第一引数はテーブル名、第二引数はそのalias
      .leftJoinAndSelect('u.photos', 'photo')
      .getMany();
  }

...

이런 식으로 돌아온다.


참고



htps: //같다. 베 / 아오 4C9d 조 7 0
htps : // typeo rm. 이오/#

좋은 웹페이지 즐겨찾기