Yii大师!
我们有一个博客。博客有一个页面,上面有作者列表。作者存储在AUTHOR表中。我使用了基本的Yii-widget CListView来显示它:
public function actionIndex() {
$dataProvider = new CActiveDataProvider('Author');
$this->render('index', array(
'dataProvider' => $dataProvider,
));
}
而不是views / author / view.php:
$this->widget('zii.widgets.CListView', array(
'dataProvider' => $dataProvider,
'itemView' => '_view',
));
但除了有关作者的信息外,此列表还必须包含每个作者的五篇随机相关文章的网址。文章标题存储在ARTICLE表中。现在我使用一个丑陋的解决方案(views / authors / _view.php):
<ul class="experts-node-articles-list">
<?php $authorArticles = Article::model()->findAllByAttributes(
array('author_id' => $data->id),
array('limit' => '5'
)); ?>
<?php foreach ($authorArticles as $item) : ?>
<li><a href="#"><?php echo CHtml::encode($item->title); ?></a></li>
<?php endforeach; ?>
</ul>
由于在视图中调用模型,这很难看。这是与MVC原则恕我直言的冲突。我能以真正的MVC方式做到这一点吗?我怀疑它可以通过模型关系和范围来完成......但不幸的是我不知道如何。
答案 0 :(得分:2)
1)在作者模型中创建关系。 (您可以像这样添加/更新relations()
方法)
public function relations()
{
return array(
.....
'randomArticles' => array(
self::HAS_MANY,
'Article',
'author_id',
'limit' => 5,
'order' => 'RAND()',
),
.....
);
}
2)你的数据提供者必须是这样的。
$dataProvider = new CActiveDataProvider('Author', array(
'criteria'=>array(
'with'=>array('randomArticles'),
),
));
3)在您的视图(views / authors / _view.php)中,您可以执行以下操作。
foreach($data->randomArticles as $article ) {
// display $article info, something like below
$this->renderPartial('_artical_info', array('article' => $article));
}
这样可以节省大量的SQL查询。