簡體   English   中英

Laravel排序最后記錄

[英]Laravel sorting last record

我正在建立一個論壇。

在主頁上,我想顯示每個論壇的最新回復。

層次結構是這樣的:

論壇

hasMany('App \\ Topic')

hasManyThrough('App \\ Topic','App \\ Repley')

主題

歸屬地('App \\ Forum')

hasMany('App \\ Reply')

回覆

歸屬地('App \\ Topic')

我這樣做:

 $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;
}

我建議的一種解決方案是讓答復touch主題。 https://laravel.com/docs/5.3/eloquent-relationships#touching-parent-timestamps

這樣,您始終可以按主題的updated_at排序,因為無論何時創建/編輯回復,都會同時更新主題。

為此,您只需要添加:

protected $touches = ['topic'];

以上假設答復模型中主題關系的方法名稱為topic()

希望這可以幫助!

您應該在所有這些模型之間建立關系。 比您可以簡單地:

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

閱讀有關可用的收集方法的更多信息: https : //www.laravel.com/docs/5.2/collections#available-methods

您可以嘗試以下方法:

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

您需要在orderBy子句中的主題和答復處寫入原始表名。

  $forum->topics->replies()->orderBy('topics.updated_at','DESC')->orderBy('repliese.updated_at','DESC')->first();
$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!";
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM