Yii2: как уменьшить количество запросов к базе данных behavior () при загрузке контроллера?

Я получаю объект модели 3 раза (Yii2) для загрузки контроллера view. Из-за этого моя страница загружается медленно. Как его уменьшить?

public function behaviors()
{
    return [
        'httpCache' => [
            'class' => 'yii\filters\HttpCache',
            'only' => ['view'],
            'lastModified' => function ($action, $params) {
                $post = $this->findModel(Yii::$app->request->get('id'));
                return strtotime($post->updated);
            },
            'etagSeed' => function ($action, $params) {
                $post = $this->findModel(Yii::$app->request->get('id'));
                return serialize([$post->updated, $post->views, $post->comments, Yii::$app->user->isGuest ? 0 : 1]);
            }
        ],
    ];
}

public function actionView($id)
{
    $model = $this->findModel($id);

    return $this->render('view', [
        'model' => $model,
    ]);
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете кэшировать экземпляр модели на уровне контроллера:

private $_models = [];

protected function findModel($id) {
    if (!array_key_exists($id, $this->_models)) {
        $this->_models[$id] = MyModel::findOne($id);
        if ($this->_models[$id] === null) {
            $this->notFound();
        }
    }

    return $this->_models[$id];
}

Только первый вызов findModel() будет запрашивать БД, следующие вызовы вернут уже созданный объект.

Хорошая попытка, спасибо. Было бы лучше поставить модель кеша или было бы сложнее?

sirjay 06.07.2018 18:03

Кэширование на уровне модели сложно. Иногда вам нужно запросить свежую модель из БД вместо кеша. И такое кеширование может увеличить потребление памяти, если вы будете использовать несколько моделей в одном запросе. Такие случаи легче обрабатывать на уровне контроллера, когда вы знаете, что вам всегда будет нужна одна модель, и вам не нужно запрашивать ее снова.

rob006 06.07.2018 18:19

Другие вопросы по теме