@dasauser
говнокодер-юниор

Как оптимизировать данный кусок кода?

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 соседних элементов, но пока я ничего другого не придумал.
  • Вопрос задан
  • 120 просмотров
Пригласить эксперта
Ответы на вопрос 2
@LemonFox
Fullstack
Сделайте просто нормальные запросы, незачем перебирать всю таблицу.
//next
SELECT * FROM foo WHERE id > <your_id> ORDER BY id LIMIT 1;
//prev
SELECT * FROM foo WHERE id < <your_id> ORDER BY id LIMIT 1;

Решение в лоб, если подумать можно найти варианты получше (но не суть важно).
П.С. прежде чем работать с orm советую ознакомиться с mysql как минимум, чтобы понимать какой запрос нужен и как организовать грамотную структуру бд.
Ответ написан
@dmitrylee
не?
или велосипеды наше все?))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы