🐚

TypeORMでリレーショナルなIDを取得する方法

2021/05/09に公開
1

課題

TypeORMで例えばUser:Post=1:NのRelationを定義する時、以下のように定義すると思います。

post.entity.ts
@ManyToOne((type) => User, (user) => user.posts)
user: User;

こうするだけで、postテーブルの中にuserIdというリレーショナルIDを自動で作成してくれます。
しかし、リレーショナルIDがTypescriptにおいては隠蔽されてしまっているので、直接アクセスすることができません。そのため、例えば、typescript上で作成されたpostインスタンスを使って、userのRepositoryにアクセスして、親のuserのデータを探して取ってくるといったことが難しいです。

getUser(post: Post) {
  const { user } = post;
  return this.userRepository.findOne(user) // 取得できない
}

解決策

以下の@RelationIdというデコレーターを使うことで解決できます。

post.entity.ts
@ManyToOne((type) => User, (user) => user.posts)
user: User;

@RelationId((post: Post) => post.user)
userId: number

このように使えます

getUser(post: Post) {
  const { userId } = post;
  return this.userRepository.findOne(userId)
}

公式のDocはこちらです
https://github.com/typeorm/typeorm/blob/master/docs/decorator-reference.md#relationid)

Discussion

たかひろたかひろ

公式のドキュメントみてもRelationIdの項目見つからず困ってて、本当助かりました!