2015-12-03 46 views
4

我可以通過使用whereHas方法查詢存在關係存在的位置,但現在我需要獲取此結果的反轉,其中結果與whereHas子句中的結果不匹配。Laravel搜索關係不存在

這裏是我的查詢:

$query->whereHas('actions', function ($query) { 
    $query->where('actions.created_at', '>', Carbon::now()->addDays(-30)); 
}); 

這獲取在過去30天內付諸行動的事情,但我需要未在過去30天內付諸行動的事情。

似乎我需要從關係中獲取max(actions.created_at),並查看該值是否大於30天前,但我不確定如何以雄辯的方式做到這一點。

注:個人和行動之間的關係是1對多,所以有可能與多個行動記錄,所以我不能只是翻轉操作是「< =」

回答

8

記住whereHas具有多於兩個參數:

$query->whereHas('actions', function ($query) { 
    $query->where('actions.created_at', '>', Carbon::now()->addDays(-30)); 
}, '=',0); 

作爲事實上,它有兩個以上,但默認情況下它被設置爲「> =」和「1」。因此,我們添加參數'='和'0'(或'<','1'表示它的重要性),將其轉換爲子查詢,如'所有不在添加的操作子集中的操作30天)。

whereHas方法:http://laravel.com/api/4.1/Illuminate/Database/Eloquent/Builder.html#method_whereHas

+0

啊!感謝這一點,沒有意識到有額外的參數,因爲它沒有在文檔中的例子。 – vonec

+0

真棒解決方案 – FosAvance

+0

謝謝你拯救我的一天... –

0

你能不能只需將您的查詢更改爲小於或等於?

$query->whereHas('actions', function ($query) { 
    $query->where('actions.created_at', '<=', Carbon::now()->addDays(-30)); 
}); 
+0

這不會起作用,因爲人與行動之間的關係是1對多。這意味着這將返回30天前創建的操作的人員,但該人員也可以在30天前創建操作。 – vonec

0

試試這個[僞代碼]:

$actions = App\Models\Action::all(); 
foreach($actions as $actionArray){ 
    $actionCreatedAt = new Carbon($actionArray->created_at); 
    $now = Carbon::now(); 
    $difference = $actionCreatedAt->diff($now)->days; 
    if($difference>30){ 
     $exceedingThirty[] = $actionArray; 
    } else { 
     continue; 
    } 
} 

然後,您可以使用$exceedingThirty陣列,在您的視圖。

OR

試試這個:

$sql = "DATEDIFF(actions.created_at, '".date('Y-m-d')."') > ". 30; 
return App\Models\Action::whereRaw($sql)->get(); 

看,如果沒有什麼幫助。

+0

謝謝。我知道我可以使用循環,但我試圖避免使用循環,如果可能的話。 – vonec