Получить соседние элементы с учетом сортировки Laravel
Есть таблица users, в ней поля name, last_name.
Задача:
- Отсортировать список по полям last_name и name
- Получить соседние элементы (предыдущий/следующий)
- Если идет выборка от крайнего элемента у которого нет следующего элемента, то подставится первый, т.о. необходимо зациклить переключение
Как получить элемент, не учитывая сортировку, понятно:
$prev = User::where('id', '<', $currentUserId)->latest('id')->first();
$next = User::where('id', '>', $currentUserId)->oldest('id')->first();
Подскажите, как сделать с сортировкой.
Ответы (1 шт):
Автор решения: vottiv
→ Ссылка
По итогу пришел к следующему решению:
- Сперва получаем коллекцию пользователей
$listUsers = User::query()->whereActive(true)
->orderBy('last_name')
->pluck('id');
- Подсчитываем количество найденных пользователей и достаем индекс пользователя от которого будем искать соседей.
$countUsers = $listUsers->count();
$indexCurrentUser = $listUsers->search($this->id);
- И последнее, достаем этих соседей
return [
'prev' => $indexCurrentUser === 0 ? $listUsers[$countUsers - 1] : $listUsers[$indexCurrentUser - 1],
'next' => $indexCurrentUser + 1 === $countUsers ? $listUsers[0] : $listUsers[$indexCurrentUser + 1],
];