🐱

TypeORMでEntityなし(IDだけ)で複数モデルsaveする方法

2020/11/27に公開

前置き

typeorm だと、saveで INSERT する方法がありますが、
relation 関係にある model を関連付けて保存するには TypeORM の Entity モデルを使用する、つまりfindを実行したインスタンスを必要とするのでは?と思っていました。

// selectでmodelを取得
const position = getRepository(Position).findOne({ where: { id: 1 } });

const memberRepository = getRepository(Member);
const _member = new Member();
_member.position = position;
await memberRepository.save(_member);

しかし、これでは update(save)のたびに不必要に id から SELECT を発行するし、不必要に Entity モデルをインスタンス化するしで、パフォーマンスが悪いです。

ID だけで保存する方法を調べました。

やりかた

おそらくいまは次のようなモデル定義と想定しています

@Entity()
class Member {
  @ManyToOne((type) => Position)
  @JoinColumn({ name: "positionId" })
  position: Position;
}
  • categorycategoryIdに紐づく

ということが表現されています。

この Entity モデルに、次のように設定します。

@Entity()
class Member {
++   @Column({ type: "int", nullable: true })
++   positionId: number;
     @ManyToOne(type => Position)
     @JoinColumn({ name: "positionId" })
     position: Position;
}

こうすることで、

  • categoryIDのプロパティをもつ
  • categorycategoryIdに紐づく

という表現になり、

const memberRepository = getRepository(Member);
const _member = new Member();
_member.positionId = 1; // idを知っていればOK
await memberRepository.save(_member);

このように、positionId を指定するだけでデータの保存が可能です。


参考
https://github.com/typeorm/typeorm/issues/447#issuecomment-298896602

Discussion