通常,好的做法是仅从控制器调用模型,然后将其传递给视图。这里有一个例子:
public function actionView($id)
{
$this->render('view', array(
'model' => $this->loadModel((int)$id),
));
}
然后,您可以在视图中使用model
来显示信息。
问题是,在我看来,我想实现片段缓存:
<?php if($this->beginCache($id, array('duration'=>3600))) { ?>
...content to be cached...
<?php $this->endCache(); } ?>
但是,由于模型是从控制器加载的,所以无论如何都会执行sql查询。我该如何防止这种情况发生?
我现在找到的唯一替代方案是从视图加载模型(在缓存部分)或执行数据缓存,但我更喜欢使用片段缓存!
您应该将缓存移动到控制器,并使用数据缓存而不是片段缓存,即:
public function actionView($id)
{
$model = Yii::app()->cache->get((int)$id);
if($model === false)
{
$model = $this->loadModel((int)$id);
Yii::app()->cache->set($id, $model, 3600);
}
$this->render('view', array(
'model' => $model,
));
}
如果需要,您仍然可以使用片段缓存(当您对已经加载的模型进行密集处理时),只需在id前面加上一些东西。