В 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, вы можете легко сортировать записи со сложными отношениями по любым столбцам и условиям.