TypeORMで外部キーでJOINしたテーブルのカラムでWHERE条件を指定する


SELECT * FROM parents
INNER JOIN children ON parents.foreign_key = children.id
WHERE children.search_column = 'target';

みたいなクエリをいい感じに書きたい。

方法1: Repository#findwhereにクエリビルダを使用する

この方法が書きたかった。whereプロパティにオブジェクトリテラルではなく関数を渡すとクエリビルダオブジェクトを受け取れる。

parentRepository.find({
  join: { alias: 'parent', innerJoin: { children: 'parent.foreignKey' } },
  where: (qb) => {
    qb.where('children.searchColumn = :searchColumn', { searchColumn: 'target' });
  },
});

参考:

方法2: 素直に最初からクエリビルダを使用する

上の方法を知るまではこう書いていた。

parentRepository.createQueryBuilder('parent')
  .innerJoin('parent.foreignKey', 'children')
  .where('children.searchColumn = :searchColumn', { searchColumn: 'target' })
  .getMany();

まとめ

TypeORMでもクエリビルダを使い始めるとほとんど型の恩恵を受けられないので、findで一部のユースケースをカバーできるのは地味にうれしい。

そしてやっぱりActiveRecordは便利だと思う。それはそうとPrismaもMigrationがついに正式版になったので(長かった)、これから始めるならそっちかなあと思ったりもする。一度触ってみたい。