1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TypeORMのQueryBuilder.get*()の選び方

Posted at

はじめに

.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稿でした。次はこれだけあればいける!集を書いてみたいです。事象の原因を切り分けるの難しいし時間かかるし、公式読んでも気が付かないし、時間が無限に欲しい。
記事や勉強法おすすめとツッコミお待ちしてます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?