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

公開:2020/11/27
更新:2021/02/24
1 min読了の目安(約1300字TECH技術記事

前置き

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