Появились непонятки с кешированием.
Возьмем пример с блогом. Есть PostController.php, модель Post.php, вьюшка show.php.
Например, мы хотим вывести страницу с постом.
В PostController.php в actionShow() делаем:
public function actionShow()
{
...
$post = Post::model()->with('categories', '... something other ...')->together()->findByPk($_GET['id']);
...
$this->render('show', array(
'model'=>$post,
));
}
Соответственно при выполнении вот этого выражения:
Post::model()->with(‘categories’, ‘… something other …’)->together()->findByPk($_GET[‘id’]);
тут же выполняется SQL запрос.
Хотелось бы во вьюшке show.php вставить кеширование:
<?php if($this->beginCache('chache-posts', array('duration'=>123456, 'varyByParam'=>array('id')) { ?>
<h1><?php echo $model->title; ?></h1>
<?php echo $model->text; ?>
<?php $this->endCache(); } ?>
Но т.к. SQL запрос на выборку данный и формирование этих данных уже выполнено в actionShow() в контроллере, то кеширование тут как бы и не помогает. Хочется кешировать именно уже финальный кусок html кода, а не саму модель, т.е. делать кеширование уже во вьюшке и не выполнять лишних запросов к БД.
Т.е. получается, что мне нужна ленивая загрузка модели. Если мы ее берем из кеша, то ничего делать не нужно, если формируем кеш, то загружаем модель.
Подскажите, как правильно кешировать и избежать описанных выше проблем? Как правильно сделать отложенную (ленивую) загрузку данных, чтобы выполнять запросы к БД и формирование данных только по требованию?