2017-09-12 92 views
0

我試圖在使用預先加載優化的關係,實施條件,與預先加載條款,但是當我做如下:Laravel與預先加載使用條件

$totalOpenQry = Enquiry::whereIn('staff_id', $employeeIds) 
      ->with(['enquiryStats' => function ($query) { 
       $query->where('is_open','=',true) 
        ->where('is_dead','=',false) 
        ->orderBy('id','asc'); 
      }]) 
      ->where('ed_timestamp', '>=', $dateRange['start']) 
      ->with('country'); 

     $totalOpen = $totalOpenQry->toSql(); 

$ totalOpenQry- > toSql()

產生以下:

'select * from `enquiries` where `staff_id` in (10, 15) and `ed_timestamp` >= '2017-09-12'; 

它似乎我無視條款中的where條件。有沒有辦法解決這個問題或正確實施?

感謝

+0

你正在使用哪個laravel版本? –

+0

關係未加載到相同的查詢中。 Eager加載仍然運行額外的查詢來加載數據,而不是每行額外的查詢。 – Devon

+0

使用Laravel 5.3。 @Devon,我認爲我可以用加載關係來加載?我的結果似乎忽略了is_open並且完全被關閉了 – liamjnorman

回答

2

whereHas()工作原理基本相同has()但允許您指定相關模型來檢查其他的過濾器。

$totalOpenQry = Enquiry::whereIn('staff_id', $employeeIds) 
     ->with('enquiryStats') 
     ->whereHas('enquiryStats', function ($query) { 
      $query->where('is_open','=',true) 
       ->where('is_dead','=',false) 
       ->orderBy('id','asc'); 
     }) 
     ->where('ed_timestamp', '>=', $dateRange['start']) 
     ->with('country'); 
// only enquiryStats that have is_open = true and is_dead = false are returned 
+0

whereHas接受參數作爲每個代碼庫[ref link](https://stackoverflow.com/questions/43174190/laravel-where-selection-for-eloquent-eager-loading-relationship) –

+0

添加一個關於它做什麼和我會趕上它。 – Devon

+1

這解決了我的問題。謝謝@先生金字塔 – liamjnorman

1

您將獲得2查詢:

1: 'select * from `enquiries` where `staff_id` in (10, 15) and `ed_timestamp` >= '2017-09-12'; 

2 Something like: 'select * from `stats` where `staff_id` in (10, 15) AND `is_open`=true...; 

->toSql()顯示第一隻。

+0

也許我誤解了,但我需要兩個是相同的查詢,以便它限制我的結果集? – liamjnorman

+0

@liamjnorman你想限制查詢或統計數據嗎? – Devon

+0

我試圖加載相關enquiryStats的查詢,然後根據enquiryStats – liamjnorman