Yii masters!
我们有一个博客。博客有一个包含作者列表的页面。作者存储在作者表中。我使用基本的 Yii-widget CListView 来显示它:
public function actionIndex() {
$dataProvider = new CActiveDataProvider('Author');
$this->render('index', array(
'dataProvider' => $dataProvider,
));
}
比视图/作者/视图.php:
$this->widget('zii.widgets.CListView', array(
'dataProvider' => $dataProvider,
'itemView' => '_view',
));
但除了有关作者的信息外,此列表还必须包含每个作者的五篇随机相关文章的 URL。文章标题存储在文章表中。现在我使用一个丑陋的解决方案(视图/作者/_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 方式做到这一点吗?我怀疑这可以通过模型关系和范围来完成......但不幸的是,我不知道如何。
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)在你的观点(观点/作者/_view.php)中,你可以做这样的事情。
foreach($data->randomArticles as $article ) {
// display $article info, something like below
$this->renderPartial('_artical_info', array('article' => $article));
}
这样可以节省大量 sql 查询。