我在CGridView中显示HAS MANY关系时遇到了一些问题。
我想在CGridView中显示特定作者的所有帖子标题,分别由',' (逗号)。
这是一个简单的例子:
我有以下表格:
作者:ID,名称
发表:ID,标题,创建(DATETIME),A_ID
帖子通过a_id属于作者。
型号:
public $postTitles;
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'posts' => array(self::HAS_MANY, 'Post', 'a_id'),
);
}
public function search()
{
// @todo Please modify the following code to remove attributes that should not be searched.
$criteria=new CDbCriteria;
$criteria->select="t.*,title AS postTitles";
$criteria->join="LEFT OUTER JOIN post on a_id=t.id";
$criteria->compare('id',$this->id);
$criteria->compare('name',$this->name,true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'sort'=>array("attributes"=>array(
'id',
'name',
)),
));
}
public function getPostTitles() {
$return = ',';
foreach ($this->posts as $post) {
$return .= $post->title;
}
return $return;
}
控制器:
public function actionIndex()
{
$model = new Author('search');
$this->render('index', array('model' => $model));
}
查看:
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'author-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'name',
array(
'id'=>'postTitles',
'type'=>'raw',
'value'=> array($model, 'getPostTitles'),
),
array(
'class'=>'CButtonColumn',
),
),
));
答案 0 :(得分:1)
在作者模型中,您可以编写一个函数,为您提供标题的名称,
public function getAuthorsPostTitles()
{
$text = 'no title yet';
if(!empty($this->posts)) // if this Author has any related Posts
{
$counter = 0;
foreach($this->posts as $post)
{
if($counter == 0)
$text = $post->title;
else
$text .= ', ' . $post->title;
}
}
return $text;
}
然后在你的网格中你可以使用它:
array(
'header'=>'Post Titles',
'value'=> '$data->getAuthorsPostTitles()',
),