[英]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.