yii2, рендерю view записи, также нужно добавлять кнопки "вперед" и "назад", для навигации по записям.
все сделал, выглядит так:
public function actionView($id)
{
// $model = Images::findOne(['id' => $id]);
$next = $id;
$prev = $id;
$all = Images::find()->all();
foreach ($all as $key => $item) {
if ($item['id'] == $id){
$model = $item;
if (array_key_exists($key + 1, $all)){
$next = $all[$key + 1]['id'];
}
if (array_key_exists($key - 1, $all)){
$prev = $all[$key - 1]['id'];
}
break;
}
}
if (!$model || !$id){
throw new HttpException(404, '404');
}
return $this->render('view', [
'model' => $model,
'next' => $next,
'prev' => $prev,
]);
}
это работает, но при большом количестве записей страницы грузятся по 10+ секунд, а это неприемлимо.
как переписать данный кусок кода? по сути мне нужно просто узнать id соседних элементов, но пока я ничего другого не придумал.
Как вариант можно сделать с помощью трех запросов (или одним при необходимости оптимизации количества запросов к БД)
public function actionView($id)
{
if ($id === null || !(($model = Images::findOne(['id' => $id])) instanceof Images)) {
throw new HttpException(404, '404');
}
$query = Images::find()->select(['id'])->limit(1);
$next = $query->where(['>', 'id', $id])->orderBy(['id' => SORT_ASC])->scalar();
$prev = $query->where(['<', 'id', $id])->orderBy(['id' => SORT_DESC])->scalar();
return $this->render('view', [
'model' => $model,
'next' => $next,
'prev' => $prev,
]);
}
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники