ウェブサイト検索

sql - TypeORM「OR」演算子


TypeORMのドキュメントにもソースコードにもOR演算子の概念は見つかりませんでした。それをサポートしているのでしょうか?

リポジトリで基本的な検索を実行しようとしています。

db.getRepository(MyModel).find({
  name : "john",
  lastName: "doe"
})

これはAND操作を生成することは分かっていますが、私はOR操作が必要なので、SQLは次のようになります:

name='john' OR lastName='doe'

こんな基本的なことで、クエリビルダーを使わなければならないのですか?

回答 #1

db.getRepository(MyModel).find({
  where: [
      { name: "john" },
      { lastName: "doe" }
  ]
})

配列を where に渡す

回答 #2

次の方法で、追加の「AND」と「OR」サブ句を組み合わせることができます。

db.getRepository(MyModel).find({
  where: [
      { name: "john", lastName: "doe" },
      { age: 20 }
  ]
})

これは〜につながる

select * from model where (name = "john" and lastname = "doe") OR age = 20

役に立てば幸いです。

回答 #3

私も同じ問題がありましたが、QueryBuilderで回避しました。

これは例になるでしょう。

return await getRepository(MyModel)
  .createQueryBuilder()
  .where("name = :name OR lastName = :lastName", {
    name: "john",
    lastName: "doe"
  })
  .getMany();

回答 #4

バージョン 0.3.18(2024-01-03リリース)以降、TypeORM は基本的な .find* メソッドで Or 演算子をサポートするようになりました:

const users = await db.getRepository(User).findBy({
    name: Or(Equal("John"), ILike("Jane%")),
})
-- Will generate the following query:
SELECT * FROM "user" WHERE "name" = 'John' OR "name" ILIKE 'Jane%'

残念ながら、これはご提示のシナリオを解決するものではなく、1つのフィールドだけが関与する場合のみに当てはまります。ただし、他のユーザーには依然として役立つかもしれません。

回答 #5

sub-clauseでORを使うには、main-clauseを繰り返す必要があります

userRepository.find({
  where: [
    {
      firstName: 'Timber',
      lastName: 'Saw',
      project: {
        name: 'TypeORM',
      },
    },
    {
      firstName: 'Timber',
      lastName: 'Saw',
      project: {
        initials: 'TORM',
      },
    },
  ],
});

name="TypeORM" または initials="TORM" のプロジェクトを持つすべての Timber Saw を見つける

関連記事