Yii CGridView与HAS_MANY的关系

时间:2014-06-12 03:15:38

标签: php yii

我在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',
            ),
        ),
    )); 

1 个答案:

答案 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()', 
),