2016-02-11 20 views
9

mi vorrebbe ottenere tutti i modelli Report dove la relazione ReportUpload 's proprietà di status è uguale a 0 o dove la relazione ReportUpload doesn' Esistono I modelli Report e ReportUpload hanno una relazione uno a uno, ReportUpload appartiene a uno Report.eloquente: Vincolare una relazione carico desideroso dove la proprietà relazione è 0 o relazione non esiste

Piuttosto insicuro su come procedere utilizzando i vincoli di relazione di eloquenti o qualsiasi altro metodo. Qualsiasi aiuto sarebbe apprezzato.

Ecco il mio codice corrente:

// 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); 
     }); 
    } 
} 

Il codice non produce i risultati desiderati.

Modifica

Cercando questo approccio, ma non so se è corretto:

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

Forse [whereDoesnHave] (https://laravel.com/api/5.1/Illuminate/Database/Eloquent/Builder.html#method_whereDoesntHave) potrebbe essere d'aiuto? –

+0

Stai suggerendo di usarlo? Perché è già nel mio codice nella domanda. Se intendevi qualcos'altro per favore chiarisci, grazie. – haakym

+0

Scusami, @haakym, ho frainteso la domanda, non penso che il mio commento precedente sia pertinente. Scusate! –

risposta

6

In primo luogo, ci sono alcuni errori nel codice iniziale.

1 - Stai verificando se la richiesta è has un uploadStatus. Quindi, $uploadStatus == $request->has, che sarà sempre true.

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

Quindi credo che si potrebbe desiderare:

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

2 - si sta confrontando rigorosamente $uploadStatus === 0 che potrebbe non funzionare perché la richiesta potrebbe restituire una stringa '0' e non un numero intero, così si dovrebbe neanche confrontare con == o trasmettere $uploadStatus a (int).

Dopo questo, credo che il codice è stato aggiunto nella sua domanda funziona come previsto:

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

Perché il where incapsulare la query lo metterà tra parentesi.

+0

Grazie per la risposta. Non posso credere di aver perso tutti quegli errori, di dare una correzione alle riprese e di tornare da te. – haakym

+0

Funziona esattamente come volevo! Molte grazie per il tuo aiuto e merito a @ jarek-tkaczyk per il suggerimento sulla query. – haakym

1

cercare di separare le query. whereDoesntHave potrebbe essere contando negativamente con la orWhereHas, anche se si tratta di una dichiarazione or:

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

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

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

Il problema con questo approccio è che non voglio eseguire 'get()' perché ho un enorme set di dati che viene impaginato usando il pacchetto dati di laravel. – haakym

Problemi correlati