🐱
TypeORMでEntityなし(IDだけ)で複数モデルsaveする方法
前置き
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;
}
-
category
はcategoryId
に紐づく
ということが表現されています。
この Entity モデルに、次のように設定します。
@Entity()
class Member {
++ @Column({ type: "int", nullable: true })
++ positionId: number;
@ManyToOne(type => Position)
@JoinColumn({ name: "positionId" })
position: Position;
}
こうすることで、
-
categoryID
のプロパティをもつ -
category
はcategoryId
に紐づく
という表現になり、
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