Laravel排序最后一条记录

时间:2016-08-25 11:18:22

标签: php laravel laravel-5.2

我正在建立一个论坛。

在主页面中,我想显示每个论坛的最后回复。

层次结构如下:

论坛

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

5 个答案:

答案 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!";
    }