我正在建立一个论坛。
在主页面中,我想显示每个论坛的最后回复。
层次结构如下:
论坛
的hasMany( '应用\主题')
hasManyThrough('App \ Topic','App \ Repley')
主题
属于关联( '应用\论坛')
的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 :(得分:1)
我建议的一个解决方案是回复touch
个主题。
https://laravel.com/docs/5.3/eloquent-relationships#touching-parent-timestamps
这样您就可以随时按主题updated_at
订购,因为无论何时创建/编辑回复,它都会更新主题。
要实现这一目标,您只需添加:
protected $touches = ['topic'];
以上假设回复模型中主题关系的方法名称为topic()
。
希望这有帮助!
答案 1 :(得分:0)
您应该在所有这些模型之间建立关系。你可以简单地说:
$forum->topics->replies->sortByDesc('created_at')->first();
详细了解集合的可用方法:https://www.laravel.com/docs/5.2/collections#available-methods
答案 2 :(得分:0)
你可以试试这个:
$forum->replies()->orderBy('id','DESC')->get();
答案 3 :(得分:0)
您需要在主题位置写入orignal表名,并在orderBy子句中回复。
$forum->topics->replies()->orderBy('topics.updated_at','DESC')->orderBy('repliese.updated_at','DESC')->first();
答案 4 :(得分: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!";
}