Eloquent Relations: how to order topics by newest posts?

Quite a typical scenario, but not easy to find the answer. You can easily order Eloquent results by some column, but what if you want to order by related column in child table? Most common example is a forum like Laracasts which shows topics in order by the latest post in that topic. How to do that? First, this is our relationship in app\Topic.php:
public function posts()
{
    return $this->hasMany(\App\Post::class);
}
Now, you need to realize that this wouldn't work:
$topics = Topic::with('posts')->orderBy('posts.created_at')->get();
What we actually need to do - two things, actually: 1. Describe a separate relationship for the latest post in the topic:
public function latestPost()
{
    return $this->hasOne(\App\Post::class)->latest();
}
2. And then, in our controller, we can do this "magic":
$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');

Let's test it out - here's our topics table. laravel topics Now, let's show all users order by latest post. If you look at the data, user ID 2 should come first with latest post on 27th day, then user ID 3 with post on 26th day, and then user ID 1 with post on 25th.
$users = User::with('latestPost')->get()->sortByDesc('latestPost.created_at');
foreach ($users as $user) {
    echo $user->id . ' - ' . $user->latestPost->title . ' (' . $user->latestPost->created_at . ')
'; }
Result: laravel users So, isn't that sweet? You can read more about sortBy and sortByDesc methods here.

No comments or questions yet...

Like our articles?

Become a Premium Member for $129/year or $29/month
What else you will get:
  • 58 courses (1056 lessons, total 44 h 09 min)
  • 78 long-form tutorials (one new every week)
  • access to project repositories
  • access to private Discord

Recent Premium Tutorials