SELECT * FROM parents
INNER JOIN children ON parents.foreign_key = children.id
WHERE children.search_column = 'target';
みたいなクエリをいい感じに書きたい。
方法1: Repository#find
のwhere
にクエリビルダを使用する
この方法が書きたかった。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がついに正式版になったので(長かった)、これから始めるならそっちかなあと思ったりもする。一度触ってみたい。