2017-03-15 66 views
0

我正在使用Laravel 5.3.30並面臨當前的問題。我試圖到處搜索,並沒有找到任何相關解決方案來滿足我的需求。因此,請在將此標記爲重複之前仔細閱讀我的問題。只有在急速加載條件滿足laravel ennial時才獲取記錄

表: [客戶],[消息]

關係:客戶有許多消息

我想要實現的是: 讓所有的客戶誰他最後的消息(contact_date)距離現在還不到一週。

我試了很多事情,包括以下內容:

Client::whereHas('messages', function($query){ 
    $query->orderBy('contact_date', 'desc') 
    ->whereDate('contact_date', '<', Carbon::now()->subDays(7)); 
})->get(); 

這是我現在告訴最好的選擇,但它不能滿足我的需求。

這將檢查客戶端的所有(contact_date),並將檢索消息少於所需日期的任何客戶端。

我的問題是: 我如何才能將這隻適用於最新的[消息]記錄?假設每個客戶端都有100條消息,並且只想將其應用於最新消息。所以,如果消息條件不符合,查詢將不會檢索客戶端。

+0

一個GROUPBY由ACCOUNT_ID分組消息? –

+0

@chasenyc你的意思是client_id,是的,儘管他的最後一條消息大於約束條件中設置的日期,但我還是試着讓它仍然得到客戶端,而不是因爲客戶端有其他消息少於那個日期。或者,也許我做錯了,請你說明一下。 – ClearBoth

回答

1

看起來你需要做一個子查詢只能加入日期超過指定日期的:

Client::select('clients.*') 
    ->join(DB::raw('(SELECT messages.* FROM messages WHERE contact_date < {$date})'), function($join) 
    { 
     $join->on('clients.id', '=', 'messages.client_id'); 
    }) 
    ->groupBy('messages.client_id') 
    ->orderBy('contact_date', 'desc') 
    ->get(); 

我不知道該代碼將很好地工作如同但它應該給你怎樣的想法去做吧。

+0

不幸的是,子查詢連接也會得到與檢查消息的較早日期相同的結果。我只想要每個客戶的最新消息。 Client :: select('clients。*') - > join(DB :: raw('(SELECT messages。* FROM messages WHERE contact_date <「'。Carbon :: now() - > subDays(7)。'」)作爲SubQuery'),函數($ join){$ join-> on('clients.id','=','SubQuery.client_id');}) - > groupBy('SubQuery.client_id') - > orderBy 'contact_date','desc') - > get();我也嘗試了不同的子查詢,但結果相同。感謝您的幫助 – ClearBoth

+0

我設法使它與子查詢一起工作!謝謝 – ClearBoth

0

您應該使用>在你的病情:

whereDate('contact_date', '>', Carbon::now()->subDays(7));

全部代碼在這裏:

Client::whereHas('messages', function($query){ 
    $query->orderBy('contact_date', 'desc') 
    ->whereDate('contact_date', '>', Carbon::now()->subDays(7)); 
})->get(); 
+0

我需要的日期少於不超過指定日期 – ClearBoth