Yii CGridView,我无法使用HAS_MANY关系

时间:2015-07-08 14:30:20

标签: php yii has-many cgridview

我在2个模型之间有HAS_MANY关系,我使用bookID作为外键

模型1 - 导入的书籍,导入的书籍可以有多个CountryOfImport

public function relations()
{ 
    return array(
       'CountryOfImportObj'=>array(self::HAS_MANY, 'CountryOfImport', 'bookID')
    );
}    

模型2 CountryOfImport ,CountryOfImport属于Importedbooks

public function relations()
{ 
    return array(
        'ImportBooksObj'=>array(self::BELONGS_TO, 'Importedbooks', 'bookID')
    );
}

现在,对于我的CGridView,我使用了Importedbooks模型的model-> search()作为我的dataProvider,从这里开始我就被困住了。

CGridView

 $data = $model->search();
 $data->setPagination(array('pageSize'=>'5'));
 $data->criteria->addCondition('active = "yes"');  
 $this->widget('zii.widgets.grid.CGridView', array(
           'dataProvider'=>$data
           ,'filter'=>$model 
           ,'pager'=>array('header'=>'')  
           ,'columns'=>array(  
                    'id',
                    'bookYear',
                    'bookTitle',
                    'DISPLAY VALUE FROM OTHER model HERE'
                    )
           )
         );

导入图书模型的DataProvider,我将其用作网格的数据提供者

public function search()
{ 
    $criteria=new CDbCriteria;               
    $criteria->compare('id',$this->id);
    $criteria->compare('bookID',$this->bookID);
    $criteria->compare('countryName',$this->countryName,true);
    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
}

该关系有效,因为我可以在我的控制器中使用以下代码从另一个模型中获取字段(countryName)

$model = Importedbooks::model()->with('CountryOfImportObj')->findbyPK(3);
print_r($model->CountryOfImportObj[0]->countryName);

1 个答案:

答案 0 :(得分:1)

例如,Importedbooks有许多CountryOfImport,您必须在一行中显示或显示所有国家/地区名称或concreet名称,具体取决于ID或countryName或其他一些属性。

您可以将匿名函数作为值传递:

'columns' => array(  
    'id',
    'bookYear',
    'bookTitle',
    array(
       'header' => 'Countries',
       'type' => 'raw',
        // if you have defined counrtyName attribute in  'Importedbooks' model, if not you can remove this row
        // also CGridView 'uses' attribute 'name' for filtering or sorting
       'name' => 'countryName',
       'value' => function($data, $row) { //$data is item of DataProvider, $row is number of row (starts from 0)
           $countries = CHtml::listData((array)$data->CountryOfImportObj, 'id', 'countryName');
           return implode(', ', $countries);
       }
    )
)

如果您想要按外部属性进行过滤或排序,则必须" declare them"

谢谢!