نتایج Eloquent را می توان با استفاده از قابلیت مرتب سازی ترتیب بندی کرد اما اگر بخواهیم از ستون یک جدول فرزند این Sort را انجام دهیم، چه کار باید انجام دهید؟ 

انجمن Laracasts را در نظر بگیرید که موضوعات را به ترتیب جدیدترین پست‌ها نمایش می‌دهد. چطور می‌توان این کار را انجام داد؟

در ابتدای کار ، رابطه ما در app \ Topic.php به صورت زیر است:

public function posts()
{
return $this->hasMany(\App\Post::class);
}

توجه داشته باشید دستور ذیل اجرا نخواهد شد و با ارور همراه است.

$topics = Topic::with('posts')->orderBy('posts.created_at')->get();

برای ترتیب دهی به مورد فوق بایستی عملیات زیر انجام شود.

1. یک رابطه جدا برای آخرین پست (latest post) در topic تعریف کنید:

public function latestPost()
{
    return $this->hasOne(\App\Post::class)->latest();
}

2. در قدم بعدی در Controller خود به صورت زیر دستور خود را بازنویسی کنید:

$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');

نتایج از حاصل را میتوانید در تصویر فوق مشاهده کنید

 

laravel-topic-post

با تغییراتی که ایجاد تمام کاربران به ترتیب جدیدترین پست‌ها نمایش داده می‌شوند.
اگر با دقت به نتایج نگاه کنید، متوجه خواهید شد که کاربر دارای شناسه 2 در ابتدا به عنوان آخرین پست در روز 27 قرار گرفته است.

$users = User::with('latestPost')->get()->sortByDesc('latestPost.created_at');
foreach ($users as $user) {
echo $user->id . ' - ' . $user->latestPost->title . ' (' . $user->latestPost->created_at . ')
';
}

با تغییرات نحوه نمایش، خروجی زیباتری نسبت به نمایش قبلی خواهیم داشت. 

results