Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Merhabalar sorguda kullandığım where has kısmını sadece çalıştırdığımda sonuçlar doğru geliyor ama aşağıda ki if li kısımlar da sorguya dahil olunca üstteki wherehas'a bakmaksızın her şeyi getiriyor bir türlü çözemedim yardımcı olur musunuz ?

        $joinLife = $request->input('join_life');
        $disneyLicences = $request->input('disney_licences');
        $companyId = $request->input('company_id');
        $instructionTypeId = $request->input('instructionTypeId');

        $result = Csr::with(['supplier_company:id,name', 'csr_process', 'csr_process.instructions']);

$result->whereHas('csr_process.instructions', function ($q) use ($instructionTypeId) {
                $q->where('instruction_type.id', $instructionTypeId);
             });


        if ($joinLife && count($joinLife) && !in_array(1, $joinLife)) {
            if ($joinLife) {
               $result->whereJsonContains('join_life', $joinLife);
            }
        }

        if ($companyId) {
            $result->whereJsonContains('company_id', $companyId);
        }

        $result->where('status', '!=', 1);
        if ($disneyLicences) {
            if ($disneyLicences["license_id"]) {
                foreach ($disneyLicences["license_id"] as $license){
                   $result->orWhere('disney_licences->license_id',$license);
                }
            }
            if ($disneyLicences["disney_id"]) {
                foreach ($disneyLicences["disney_id"] as $disney){
                   $result->orWhere('disney_licences->disney_id',$disney);
                }
            }
        }

        $result = $result->get()->toArray();
        return Output::success($result);
  • mgsmus bunu yanıtladı.
  • programmer1453 Şu şekilde orWhere kullandığınızda ilk orWhere ile diğer şartlar otomatik olarak devre dışı kalır çünkü oraya geldiğinizde ya da deyip diğerlerini bırakıyorsunuz:

    // A ve B veya C veya D
    // C ya da D işin içine girdi mi doğal olarak A veya B'nin bir anlamı kalmıyor
    
    /* A */ ->where()
    /* B */ ->where()
    /* C */ ->orWhere() // <- Üstteki şartlar iptal
    /* D */ ->orWhere() // <- C de dahil, üstteki şartlar iptal

    O yüzden şöyle yapmanız lazım:

    // A ve B ve (C veya D)
    // Burası artık (A ve B ve C) ya da (A ve B ve D) şeklinde çalışacak. Yani A ve B her zaman dahil edilecek.
    
    /*  A  */ ->where()
    /*  B  */ ->where()
    /* C/D */ ->where(function($query) {
                  $query->where()
                      ->orWhere();
               })

    Kral biraz araştırma yaptım şunları buldum umarım bi faydam olur.

    Sorun:
    whereHas koşulu tek başına çalışırken doğru sonuçları verirken, if blokları da dahil olduğunda tüm sonuçları getiriyor.
    Sebep:
    whereHas ve if blokları farklı sorgular oluşturuyor ve bu sorgular birleştirilmiyor.
    Çözüm Önerileri:

    1. whereHas Koşulunu Ana Sorguya Dahil Etme:

    $result = Csr::with(['supplier_company:id,name', 'csr_process', 'csr_process.instructions'])
        ->whereHas('csr_process.instructions', function ($q) use ($instructionTypeId) {
            $q->where('instruction_type.id', $instructionTypeId);
        });
    
    // "if" bloklarını "whereHas" içine taşıyın ve gerekli filtrelemeyi yapın
    
    if ($joinLife && count($joinLife) && !in_array(1, $joinLife)) {
        $result->whereJsonContains('join_life', $joinLife);
    }
    
    if ($companyId) {
        $result->whereJsonContains('company_id', $companyId);
    }
    
    if ($disneyLicences) {
        if ($disneyLicences["license_id"]) {
            foreach ($disneyLicences["license_id"] as $license){
                $result->orWhere('disney_licences->license_id',$license);
            }
        }
        if ($disneyLicences["disney_id"]) {
            foreach ($disneyLicences["disney_id"] as $disney){
                $result->orWhere('disney_licences->disney_id',$disney);
            }
        }
    }
    
    // Sonuçları alalım ve JSON formatında döndürelim
    $result = $result->get()->toArray();
    return Output::success($result);

      programmer1453 Şu şekilde orWhere kullandığınızda ilk orWhere ile diğer şartlar otomatik olarak devre dışı kalır çünkü oraya geldiğinizde ya da deyip diğerlerini bırakıyorsunuz:

      // A ve B veya C veya D
      // C ya da D işin içine girdi mi doğal olarak A veya B'nin bir anlamı kalmıyor
      
      /* A */ ->where()
      /* B */ ->where()
      /* C */ ->orWhere() // <- Üstteki şartlar iptal
      /* D */ ->orWhere() // <- C de dahil, üstteki şartlar iptal

      O yüzden şöyle yapmanız lazım:

      // A ve B ve (C veya D)
      // Burası artık (A ve B ve C) ya da (A ve B ve D) şeklinde çalışacak. Yani A ve B her zaman dahil edilecek.
      
      /*  A  */ ->where()
      /*  B  */ ->where()
      /* C/D */ ->where(function($query) {
                    $query->where()
                        ->orWhere();
                 })

        mgsmus
        Abi Çok Teşekkür Ederim bu yöntem çalıştı, Allah razı olsun 🙂

        dsmndhm
        Kıral Cevabınız için çok teşekkür ederim, bu yöntemi denemiştim ama sağlıklı bir sonuç vermiyor istenilen şekilde çalışmıyordu 😊