2016-02-11 20 views
9

我想獲得的所有Report車型,其中關係ReportUpload的的status屬性等於0 其中ReportUpload關係沒有按'不存在。 ReportReportUpload模型有一對一的關係,ReportUpload屬於Report雄辯:約束熱切的負載關係,其中關係屬性爲0或關係不存在

有些不確定如何去使用雄辯的關係約束或任何其他方法。任何幫助,將不勝感激。

這裏是我當前的代碼:

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

的代碼不會產生預期的效果。

編輯

嘗試這種做法,但不知道這是否是正確的:

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

也許[whereDoesnHave](https://laravel.com/api/5.1/Illuminate/Database/Eloquent/Builder.html#method_whereDoesntHave)可能有幫助嗎? –

+0

你是在暗示我使用它嗎?因爲它已經在我的代碼中。如果你的意思是別的,請澄清,謝謝。 – haakym

+0

對不起,@haakym,我誤解了這個問題,我不認爲我以前的評論是相關的。抱歉! –

回答

6

首先,在你的初始代碼一些錯誤。

1 - 您正在檢查請求has是否爲uploadStatus。然後,$uploadStatus == $request->has這將永遠是true

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

所以我猜你可能想:

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

2 - 你比較嚴格$uploadStatus === 0可能無法工作,因爲請求可能會返回一個字符串'0',而不是一個整數,所以你要麼與==或鑄$uploadStatus(int)比較。

在此之後,我覺得你在你的問題中添加的代碼按預期工作:

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

因爲where封裝查詢將放在括號之間。

+0

感謝您的回答。我不能相信我錯過了所有這些錯誤,會給你更正一個鏡頭,並回到你身邊。 – haakym

+0

就像我想要的那樣工作!非常感謝您的幫助,並感謝@ jarek-tkaczyk提供的查詢提示。 – haakym

1

嘗試分開查詢。 whereDoesntHave可能負與orWhereHas來計算,即使它是一個or聲明:

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

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

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

這個問題方法是我不想執行'get()',因爲我有一個龐大的數據集,它使用laravel datatables包進行分頁。 – haakym