Merhaba arkadaşlar,
Başlık biraz garip olabilir. Nasıl bir başlık yazacağımı düşündüm ama çıka çıka anca bu çıktı 🙂
Eloquent ile bir sorguyu yazmakta zorlandım. Şöyle bir sorunum var;
Tender ve Offer adında 2 modelim var. Amacım benim teklif verdiğim bir ihalede eğer teklifim seçili ise o ihaleleri listelemek. Kısaca kazandığım ihaleleri görmek istiyorum.
Şu anda teklif verdiğim ihaleleri listeliyorum ama kazandığım şartını ekleyemedim.
$items = Tender::query()
->whereHas(
'offers', function($query){
$query
->where('created_by', '=', auth()->user()->id)
// ->where(['id' => 'tenders.selected_offer_id']) // YA BURADA TEKLİFİN İD DEĞERİ İLE İHALENİN SEÇİLİ TEKLİF İD DEĞERİ EŞLEŞMELİ
// ->where(['selected_offer_id' => $query->getModel()->id]) // BU ŞEKİLDE DENEDİĞIMDA TENDER MODELİNİ ALIYOR AMA NULL DÖNDÜRÜP ÇALIŞMIYOR (MEVCUT SQL ÇIKTISI KISMINA BU SATIR AKTİF OLDUĞUNDA OLUŞAN ÇIKTIYI EKLEDİM)
;
}
)
// ->where(['selected_offer_id' => 'offers.id']) // YA DA BURADA İHALENİN SEÇİLİ TEKLİ İD DEĞERİ TEKLİFİN İD DEĞERİ İLE EŞLEŞMELİ
->othersTenders()
->published()
->get()
;
Mevcut sorgunun çıktısı şu şekilde;
SELECT *
FROM `tenders` WHERE EXISTS (
SELECT *
FROM `offers`
WHERE `tenders`.`id` = `offers`.`tender_id`
AND `created_by` = 2
AND (`selected_offer_id` IS NULL) # $query->getModel()->id İLE DENEDİĞİMDE BU ŞEKİLDE NULL DEĞER DÖNDÜĞÜNDEN SONUÇ VERMİYOR
)
AND `created_by` != 2
AND `is_published` = 1
ORDER BY `created_at` DESC
Beklediğim SQL çıktısı şu şekilde olmalı;
SELECT *
FROM `tenders`WHERE EXISTS (
SELECT *
FROM `offers`
WHERE `tenders`.`id` = `offers`.`tender_id`
AND `created_by` = 2 # ÖRNEK SORGUDAKİ DEĞER
AND (`selected_offer_id` = `tenders`.`id`) # BURADAKİ --> `tenders`.`id` <-- KISMINI ELOQUENT İLE VEREMEDİM
)
AND `created_by` != 2 # ÖRNEK SORGUDAKİ DEĞER
AND `is_published` = 1 # ÖRNEK SORGUDAKİ DEĞER
ORDER BY `created_at` DESC
Kesin çok basit bir cevabı vardır da yorgunluktan gözden kaçıyordur 😃 İlgilenen arkadaşlara şimdiden teşekkür ederim.