🐚
TypeORMでリレーショナルなIDを取得する方法
課題
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はこちらです
Discussion
公式のドキュメントみてもRelationIdの項目見つからず困ってて、本当助かりました!