Есть вещи, которые бесят в коде сильнее, чем неделя без сна. Например, когда для того, чтобы сделать две сраные кнопки «предыдущая» и «следующая», тебе начинают впаривать «архитектуру, готовую к масштабированию» и прочий корпоративный бред. Нет, друг, тут нет архитектуры. Тут три строки запроса. Всё. Но давай разберём честно, как это делается, чтобы потом не ковыряться в чужом индус-коде и не материться ночью на Eloquent.
Шаг 1. Получаем текущий пост
Очевидно, что сначала надо понять, где мы вообще находимся. У нас есть Post, у него есть ID, и Laravel прекрасно его достаёт. Да, даже если ты только проснулся и ещё не пил кофе:
use App\Models\Post;
Route::get('/post/{id}', function ($id) {
$post = Post::find($id);
return view('post.show', compact('post'));
});
Всё, у нас на руках конкретный пост. Без него двигаться дальше — это как искать водку в пустом холодильнике.
Шаг 2. Достаём предыдущий и следующий
Теперь начинается вся магия уровня «детский сад». Нам нужно два запроса: один смотрит назад, другой вперёд.
// Предыдущий $previousPost = Post::where('id', '<', $post->id)
->orderBy('id', 'desc')
->first();
// Следующий $nextPost = Post::where('id', '>', $post->id)
->orderBy('id', 'asc')
->first();
Если коротко: мы тупо сравниваем ID. И это норм, потому что ID в большинстве случаев растёт по порядку. Если у тебя хитрая сортировка «по дате» или «по луне в 9-м доме», то да, подменяй столбец.
Шаг 3. Рисуем кнопки в Blade
Тут уже без философии. Если пост есть — рисуем кнопку, если нет — идём лесом.
@if($previousPost)
<a href="{{ route('post.show', $previousPost->id) }}">← Назад</a>
@endif
@if($nextPost)
<a href="{{ route('post.show', $nextPost->id) }}">Вперёд →</a>
@endif
Хочешь кнопки с Tailwind, Bootstrap или в стиле «мне похрен, лишь бы кликалось» — пожалуйста. Логика от этого не меняется.
Шаг 4. Не забудь про маршруты
Если у тебя нет нормального маршрута для показа поста, Laravel тебе, конечно, ничего не подарит. Ну кроме боли. Так что добавь:
Route::resource('post', PostController::class);
Если ты используешь ресурсные маршруты, Laravel сам сообразит. Если нет — ну, тогда сам себе злобный Буратино, допиши вручную.
Итого
Мы получили:
- Взял пост.
- Нашёл соседей по ID.
- Показал кнопки.
Всё. Хоть для блога, хоть для галереи котиков, хоть для админки, где надо листать отчёты по недоплаченным счетам.
0 комментариев