2016-08-25 76 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!"; 
    }