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

189
10 июля 2019, 14:10

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 соседних элементов, но пока я ничего другого не придумал.

Answer 1

Как вариант можно сделать с помощью трех запросов (или одним при необходимости оптимизации количества запросов к БД)

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,
    ]);
}
READ ALSO
Чем смотреть логи error.log? [закрыт]

Чем смотреть логи error.log? [закрыт]

При распаковке одного архива из десятка domainru

209
чпу для ссылки с якорем

чпу для ссылки с якорем

Настраиваю чпу для сайта первый раз и столкнулся с ситуацией - есть у меня якорь на главной странице и я хочу что бы нажимая на кнопку ГЛАВНАЯ(в...

202
Проблема с загрузкой пакета на Packagist

Проблема с загрузкой пакета на Packagist

Создал пустой репозиторий на GitHubСделал push проекта

173