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 を見つける
