2017-01-18 159 views
1

我在通知和alerFrequencies表之間有一對多的關係。他們都有模型。我寫了這個函數從alerFrequencies表中提取所有最新的created_at時間戳。Laravel:一對多關係只返回一條記錄

例如,如果我的通知表中有一個網站,並且在警報表中有created_at時間戳記,它應該只返回最新的時間戳記。如果我在通知表中有2個網站的時間戳不同,它應該將這兩個網站的時間戳分開。

不管通知表中的網站數量如何,它只返回最新的。一個誰得到一個更好的主意寫的查詢,我將不勝感激各種幫助和建議。

public function alert(){ 
     $alert_timestamp = AlertFrequency::with('notification')->select('created_at')->groupBy('created_at')->orderBy('created_at','DESC')->first(); 
     $alert_timestamp=$alert_timestamp->created_at->toDateTimeString(); 
     if($alert_timestamp==null){ 
      return false; 
     }  
      return $alert_timestamp; 
    } 

在數據庫中我要表通知和alerFrequencies表,具有一對多的關係。 notification_id是alertFreqency表中的外鍵。通知有列:是,網址和alertFrequencies有:id。 notification_id和created_at。現在我想獲取通知表中每個網站的最新created_at。

+0

我不知道你要做什麼。上述查詢將只返回1個alert_frequency和** only **表中的created_at字段。這兩部分在你的查詢中完全沒有任何用處:'​​:: with('notification')''''> groupBy('created_at')'。如果您在選擇(或任何您的外鍵)中不包含'id',則無法加載關係。由於您只選擇最新的(' - > first()')'created_at'字段,所以group by將不會分組。 – devk

+0

當然,它只返回一個,因爲在你的查詢中你只選擇第一個,在你的查詢結束 - > first()選擇第一條記錄,將其更改爲 - > get() –

+0

@Levente Nagy給我錯誤:未定義的屬性:Illuminate \ Database \ Eloquent \ Collection :: $ created_at –

回答

0

有幾件事你做錯了。首先你要查詢AlertFrequency::with('notification'),而從我的理解中你可能需要諸如Notification::with('alertfrequencies')之類的東西。第二件事是你只選擇一列。只選擇一列會使with函數無用。您做錯的第三件事是按created_at列進行分組。這根本不會滿足您的需求。你將不得不groupBy('notification_id')。我寫了上面的解釋,這樣你可以更好地理解你的應用程序的邏輯,而我在下面給出一個可能的解決方案。

鑑於您希望爲每個網站提供最新的通知時間戳,那麼可能的方法是在您的模型中添加訪問器。

public function getLastTimestampAttribute(){ 
    return AlertFrequency::where('notification_id', $this->attributes['id'])->order_by('created_at','desc')->first()->created_at; 
} 

然後,你可以通過做$notification->last_timestamp,假設$notification是在看你的對象很容易地訪問最新的時間戳每個通知。

+0

tnx非常多....它花了我大約一個星期,無法弄清楚。你救了我......真的很感謝你 –

+0

解決方案工作正常,我應該問你一個問題。如果想要爲所有網站自動插入created_at方法到lertFrequency表中,我該怎麼辦? –

+0

你的意思是將它插入到數據庫中或在記錄創建時插入到數據庫中?或檢索值? – xhulio