2016-02-11 18 views
9

Chciałbym uzyskać wszystkie modele Report gdzie relacja ReportUpload jest własnością status równa 0 lub gdzie ReportUpload relacja nie robi " t istnieje. Modele Report i ReportUpload mają relację jeden do jednego, ReportUpload należy do Report.Eloquent: Ograniczanie chętny relację obciążenia gdzie nieruchomość relacja wynosi 0 lub związek nie istnieje

Nie jest pewne, jak to zrobić, stosując elokwentne ograniczenia zależności lub dowolną inną metodę. Każda pomoc będzie doceniona.

Oto mój bieżący kod:

// initial query 

$reports = Report::whereHas('link', function($query) { 
     $query->where('status', 'complete'); 
    })->with('student', 'course', 'institution', 'reportUpload'); 


// apply constraint 

if ($request->has('uploadStatus')) { 
    $uploadStatus = $request->has('uploadStatus'); // 0 or 1 

    if ($uploadStatus === 0) { 
     $reports = $reports 
      ->whereDoesntHave('reportUpload') 
      ->orWhereHas('reportUpload', function($query) use ($uploadStatus) { 
       $query->where('status', $uploadStatus); 
      }); 
    } else { 
     $reports = $reports->whereHas('reportUpload', function($query) use ($uploadStatus) { 
      $query->where('status', $uploadStatus); 
     }); 
    } 
} 

Kod nie przynieść oczekiwanych rezultatów.

Edit

Trying to podejście, ale nie wiem, czy to jest poprawne:

$reports = $reports 
    ->where(function ($query) use ($uploadStatus) { 
     $query 
      ->whereDoesntHave('reportUpload') 
      ->orWhereHas('reportUpload', function($query) use ($uploadStatus) { 
       $query->where('status', $uploadStatus); 
      }); 
    }); 
+0

Być może [whereDoesnHave] (https://laravel.com/api/5.1/Illuminate/Database/Eloquent/Builder.html#method_whereDoesntHave) może pomóc? –

+0

Sugerujesz, że go używam? Ponieważ jest już w moim kodzie w pytaniu. Jeśli chodzi ci o coś innego, wyjaśnij, dziękuję. – haakym

+0

Przepraszam, @haakym, źle zrozumiałem pytanie, nie sądzę, że mój poprzedni komentarz jest istotny. Przepraszam! –

Odpowiedz

6

Po pierwsze, istnieją pewne błędy w początkowej kodu.

1 - Sprawdzasz, czy żądanie: has a uploadStatus. Następnie $uploadStatus == $request->has, który zawsze będzie true.

if ($request->has('uploadStatus')) { 
    $uploadStatus = $request->has('uploadStatus'); 

Więc myślę, że warto:

if ($request->has('uploadStatus')) { 
    $uploadStatus = $request->input('uploadStatus'); 

2 - jesteś porównując ściśle $uploadStatus === 0 który może nie działać, ponieważ żądanie może powrócić ciąg '0' a nie całkowitą, więc powinien albo porównać z == lub obsłużyć $uploadStatus do (int).

Po tym, myślę, że kod został dodany w swoim pytaniu działa zgodnie z oczekiwaniami:

$reports = $reports 
->where(function ($query) use ($uploadStatus) { 
    $query 
     ->whereDoesntHave('reportUpload') 
     ->orWhereHas('reportUpload', function($query) use ($uploadStatus) { 
      $query->where('status', $uploadStatus); 
     }); 
}); 

Ponieważ where enkapsulacji zapytanie będzie umieścić go w nawiasach.

+0

Dzięki za odpowiedź. Nie mogę uwierzyć, że tęskniłem za tymi wszystkimi błędami, które spowodują, że poprawki będą trafione i wrócą do ciebie. – haakym

+0

Działa dokładnie tak, jak chciałem! Wielkie dzięki za pomoc i uznanie @ jarek-tkaczyk za wskazówkę dotyczącą zapytania. – haakym

1

spróbować oddzielić zapytania. whereDoesntHave może być licząc ujemnie z orWhereHas nawet jeśli jest to or stwierdzenie:

$reportsNoUpload = $reports 
      ->whereDoesntHave('reportUpload')->get(); 

$reportsIncomplete = $reports 
      ->orWhereHas('reportUpload', function($query) use ($uploadStatus) { 
       $query->where('status', $uploadStatus); 
      })->get(); 

$reports = $reportsNoUpload->merge($reportsIncomplete); 
+0

Problem z tym podejście polega na tym, że nie chcę wykonywać 'get()', ponieważ mam ogromny zestaw danych, który jest paginowany przy użyciu pakietu laravel datatables. – haakym