Как отсортировать записи со сложными отношениями?

В Laravel для сортировки записей со сложными отношениями можно использовать метод orderBy вместе с методом with.

Допустим, у нас есть две модели: User и Post. Отношение между ними - "один ко многим", где каждый пользователь может иметь несколько постов. Давайте рассмотрим пример:

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

class Post extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Теперь предположим, что мы хотим отсортировать пользователей по количеству их постов, а затем каждого пользователя отсортировать по дате создания его постов.

$users = User::with(['posts' => function ($query) {
    $query->orderBy('created_at', 'desc');
}])
    ->withCount('posts')
    ->orderBy('posts_count', 'desc')
    ->get();

В данном примере мы использовали метод with для загрузки отношения posts для каждого пользователя, а также метод withCount, чтобы добавить счетчик постов для каждого пользователя.

Затем мы использовали метод orderBy для сортировки пользователей по количеству их постов с помощью столбца posts_count (который был добавлен с помощью withCount), а также для сортировки каждого пользователя по времени создания его постов с помощью столбца created_at.

Теперь, если мы выведем на экран полученные пользователей, они будут отсортированы по количеству их постов, а внутри каждого пользователя по времени создания постов.

foreach ($users as $user) {
    echo $user->name . ': ' . $user->posts_count . ' posts' . PHP_EOL;
    
    foreach ($user->posts as $post) {
        echo '- ' . $post->title . ' created at ' . $post->created_at . PHP_EOL;
    }
}

Данная конструкция будет выводить список пользователей с количеством их постов, а затем для каждого пользователя выводить список его постов с указанием времени создания.

Таким образом, с использованием методов orderBy и with в Laravel, вы можете легко сортировать записи со сложными отношениями по любым столбцам и условиям.