Yii2:加载控制器时如何减少behaviors()数据库查询?

时间:2018-07-06 15:05:59

标签: php yii yii2

我正在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,
    ]);
}

1 个答案:

答案 0 :(得分: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()的第一次调用将查询数据库,下次调用将返回已实例化的对象。