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.
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:
So, isn't that sweet? You can read more about sortBy and sortByDesc methods here.
No comments or questions yet...