TypeORMでリレーション先のエンティティのidを使って検索する

TypeORMでリレーション先のエンティティのidを使って検索する

TypeORMはまだ使用歴が浅く、1対多などのリレーションの関係があった時に、リレーション先のエンティティのidで検索する方法がドキュメントに見つからずぱっとわからなかったのでメモ。

試したこと

まずは、取得したい対象のエンティティがuserエンティティと1対多の関係にあるという前提で、以下のように書いてみました。この記述だけでいける、といった内容記事が割と多くみられました。

await this.repository
      .find({
        where: { user: { id: 123 } }
      })

しかし、これを記述しただけではNGでした。

エンティティにJoinColumnを定義する必要がある

さらに検索を続けていくと、以下のGitHubのIssueが見つかりました。

https://github.com/typeorm/typeorm/issues/4396

こちらに記載してある通り、エンティティの定義に以下のようにJoinColumnの記述を追加する必要があるようです。(前段落に書いたコードそのままでOK)

@ManyToOne(() => User)
@JoinColumn({ name: "userId" }) // ←追記
user?: User;

ただし、この方法だとuserテーブルのプライマリキーであるidでは検索できますが、他のカラムで検索するのは難しいようです。

今扱っているプロジェクトでは現時点そのような要件がないので考慮していませんが、そういった要件が出てきた場合はIssueの下の方に書いてある、クエリ記載する方法でないと実現が難しそうですね。

TypeORM、割と使いやすくて気にっているんですが、細かいことをやろうとするとやり方が見つかりにくかったりして、Laravelでのサーバサイドの実装に慣れている自分にとってはまだまだ未知な領域が多いです。引き続き勉強していって、新たに発見した点を共有できればと思います。