sql - TypeORM "VEYA" operatörü
Ne TypeORM belgelerinde ne de kaynak kodunda OR operatörüyle ilgili herhangi bir kavram bulamadım. Acaba bunu destekliyor mu?
Bir depo ile basit bir arama yapmaya çalışıyorum.
db.getRepository(MyModel).find({
name : "john",
lastName: "doe"
})
Bunun bir AND işlemi ürettiğini biliyorum ama ben bir OR işlemi istiyorum, bu yüzden SQL şöyle görünecek:
name='john' OR lastName='doe'
Böyle basit bir şey için sorgu oluşturucuyu kullanmak zorunda mıyım?
Cevap #1
db.getRepository(MyModel).find({
where: [
{ name: "john" },
{ lastName: "doe" }
]
})
where'e bir dizi geçirin
Cevap #2
Aşağıdakileri yaparak "VEYA" alt cümlesini ek "VE" ile birleştirebilirsiniz.
db.getRepository(MyModel).find({
where: [
{ name: "john", lastName: "doe" },
{ age: 20 }
]
})
Bu şu sonucu doğururdu
select * from model where (name = "john" and lastname = "doe") OR age = 20
Umarım bu yardımcı olur.
Cevap #3
Ben de aynı sorunla karşılaştım, ama QueryBuilder ile bunu aştım.
Bu bir örnek olacaktır.
return await getRepository(MyModel)
.createQueryBuilder()
.where("name = :name OR lastName = :lastName", {
name: "john",
lastName: "doe"
})
.getMany();
Cevap #4
0.3.18 sürümünden itibaren (03-01-2024 tarihinde yayınlandı), TypeORM artık temel .find* yöntemlerinde bir Or operatörünü desteklemektedir:
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%'
Ne yazık ki bu, sunduğunuz senaryoyu çözmüyor, sadece tek bir alanın dahil olduğu durumları çözüyor. Yine de diğer kullanıcılar için işe yarayabilir.
Cevap #5
sub-clause içinde OR kullanmak için main-clause'u tekrar etmem gerekiyor
userRepository.find({
where: [
{
firstName: 'Timber',
lastName: 'Saw',
project: {
name: 'TypeORM',
},
},
{
firstName: 'Timber',
lastName: 'Saw',
project: {
initials: 'TORM',
},
},
],
});
Tüm Timber Saw öğelerini, name="TypeORM" veya initials="TORM" projelerine sahip olanları bulun
