2016-08-25 125 views
0

我正在建立一個論壇。Laravel排序最後記錄

在主頁面中,我想顯示每個論壇的最後一個回覆。

層次結構是這樣的:

論壇

的hasMany( '應用程序\主題')

hasManyThrough( '應用程序\主題', '應用程序\ Repley')

topics

belongsTo('App \ Forum')

的hasMany( '應用\回覆')

回覆

屬於關聯( '應用程序\主題')

我這樣做:

$forum->replies()->orderBy('created_at', 'desc')->first() 

和它的工作。但我想按主題和回覆進行排序。 如果我在最後一個回覆後發佈新主題,我希望將該節目作爲最後一個回覆。

更新: 我這樣做,它的工作。但有沒有其他方法?

public function last() { 
    $topic = $this->topics->sortByDesc('created_at')->first(); 
    $post = $this->replies->sortByDesc('created_at')->first(); 

    return ($topic->created_at > $post->created_at) ? $topic : $post; 
} 
+0

什麼是論壇,主題和回覆的關係? –

+0

得到最後的重播,得到最後的話題,檢查誰是新的 –

+0

容易,雄辯的方式https://softonsofa.com/tweaking-eloquent-relations-how-to-get-latest-related-model/ –

回答

0

你應該有所有這些模型之間的關係。比你可以簡單:

$forum->topics->replies->sortByDesc('created_at')->first(); 

瞭解更多關於可用方法的集合:https://www.laravel.com/docs/5.2/collections#available-methods

+0

我認爲他想這樣的:他有答覆和話題,他想展示一個誰是新的,所以如果有一個話題比重播較新的展示主題,如果有重播比其他任何主題比新顯示重播 –

+0

我認爲,在開始新的話題應該有1篇文章(主貼什麼,我認爲是存儲在回覆表)。如果沒有,並且你的版本是正確的,那麼他必須使用我的上面的代碼,並且類似於獲取最新的主題,而不是比較自己。 – Mishek

+0

@AmirBar是的,那是我想要的。 – yehuda4e

0

你可以試試這個:

$forum->replies()->orderBy('id','DESC')->get(); 
0

一個解決方案,我建議是有回答touch主題。 https://laravel.com/docs/5.3/eloquent-relationships#touching-parent-timestamps

這樣,您可以隨時按主題的updated_at進行訂購,因爲每當創建/編輯答覆時,它也會更新主題。

要做到這一點,你就只需要添加:

protected $touches = ['topic']; 

以上是假設在答覆模型的主題關係的方法名稱爲topic()

希望這會有所幫助!

0

您需要在主題位置編寫orignal表名並在orderBy子句中回覆。

$forum->topics->replies()->orderBy('topics.updated_at','DESC')->orderBy('repliese.updated_at','DESC')->first(); 
+0

未定義的屬性:照亮\數據庫\雄辯\收藏:: $回覆錯誤.. – yehuda4e

+0

@ yehuda4e你有時間標記回覆表? –

+0

@ yehuda4e我已經編輯答案只是試試看,如果你再次得到錯誤比附上錯誤的快照,讓我看到它給了什麼錯誤 –

0
$latestReplay = Replay::orderBy('created_at','desc')->first(); 
$lastTopic = Topic::orderBy('created_at','desc')->first(); 

    if ($latestReplay->created_at->gt($lastTopic->created_at)) { 
      echo $lastReplay->title." is the newer!!"; 
    } else { 
      echo $lastTopic->title." is the newer!"; 
    }