はじめに
.get〇〇()の選び方だけ知りたい人は分岐①②を踏みましょう。
typeORMでselect文を作りたい! || データがUndefinedになった!という人へ。
-
事象
取得データ:undefinedになる。
エラーログ:無し。 -
デバック手順
①DB接続は成功している
②DBにデータが入っている
③クエリは適切
.getQuery()/.getParameter()を最後の.get〇〇()等と置き換えてログに出力する。
""など余計なものを消して、パラメーターをセットしてDB直接検索したら欲しいデータが取れた。
→???
結論
受け取る型をEntiry定義していなかったため、.getMany()で取得できなかった。「Raw」をつけたら解決。
分岐①②を見て.get①②()を選ぶ。
分岐①受け取る型はEntity?Rawなし:Rawあり
- Entityとして定義してある型で受け取るときはRawをつけない(.getOne()/.getMany())
- その場で作ったInterfaceなど、Entiryとして定義してない型で受け取りたいとき=Rawをつける(getRawOne()/.getRawMany())
分岐②取得するデータ(レコード)は単数か?One:Many
- 1レコードのみ取得したいとき=One
※「1カラム」じゃなくて「1行」。配列じゃなければOKなので、.addSelect()も使える。 - 複数レコード(配列[])の形で取得したいとき=Many
リファレンス:公式
https://typeorm.io/select-query-builder#using-subqueries
英語は易しめでいろんな例が載ってる。使えそうなメソッドを探すのにちょうどいい。
ただ、難しめの挙動(subQueryやaddwhere)は理解するのがちょっと大変だった。
TypeORMの良いところ
- Entityと自動的に結びついてくれるため、呼び出すのが楽。
- 直感的でわかりやすい。カンでメソッド名が当たる(leftjoinはinnerjoin)。以下例。
.queryBuilder()
.select().addSelect().from().addfrom().innerjoin().where().andwhere().orWhere().get〇〇() - 結構力技が使えるのがツボ。SQLベタ書きできるし、ベタ書きと組み合わせても使える。subQueryのsubquery突っ込んでも動く。
最後に
1年目よわよわエンジニアの七転八倒記第1稿でした。次はこれだけあればいける!集を書いてみたいです。事象の原因を切り分けるの難しいし時間かかるし、公式読んでも気が付かないし、時間が無限に欲しい。
記事や勉強法おすすめとツッコミお待ちしてます。