如何建立关系在Cgridview中显示4个表的列


How To Build Relations To Display Columns Of 4 Tables In Cgridview

我有一个需求,需要在3个以上的表之间建立关系。我有4个表,即Message、Flat、Person、Mapping表。现在,下表有以下字段:

消息

`Id` int(11) NOT NULL AUTO_INCREMENT,                
`Mapid` int(11) DEFAULT NULL,                     
PRIMARY KEY (`Id`),                                
KEY `FK41715B218022FC0` (`MapId`)                    

映射

`Id` int(11) NOT NULL AUTO_INCREMENT,  
`FlatId` int(11) DEFAULT NULL,
PRIMARY KEY (`Id`),  
KEY `FKE2B3C68A24F94F50` (`FlatId`),

平坦

`Id` int(11) NOT NULL AUTO_INCREMENT,               
`PersonId` int(11) DEFAULT NULL,                    
PRIMARY KEY (`Id`),                                
  KEY `FK2FFF79122B94A6` (`PersonId`),              

人员

`Id` int(11) NOT NULL AUTO_INCREMENT,  
`Name` varchar(255) DEFAULT NULL,  
 `FlatId` int(11) DEFAULT NULL,  
`Phone` varchar(255) DEFAULT NULL,  
PRIMARY KEY (`Id`),  
KEY `FKC4E39B55AF5432C` (`FlatId`),

现在,我必须以这样一种方式建立关系,即在Message的Cgridview(admin.php)中,我应该显示平面表的PersonId和Person表的Name和Phone以及Message表的列。

我在消息(message.php)的模型类中定义了这样的关系

   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(
    'mapping' => array(self::BELONGS_TO, 'Mapping', 'MapId'),
    'flat'=>array(self::HAS_ONE,'Flat',array('FlatId'=>'Id'),'through'=>'mapping'),
    'person'=>array(self::HAS_ONE,'Person',array('PersonId'=>'Id'),'through'=>'flat'),
    );
}

有人能向我解释一下在消息网格视图中显示个人表列的分步过程吗。

假设您可以为CGridView创建dataProvider

<?php 
$this->widget('zii.widgets.grid.CGridView',array(
    'id'=>'message-grid',
    'dataProvider'=>$yourDataProvider //such as $model->search();
    'filter'=>$model,
    'columns'=>array(
        'Id',
        'Mapid',
        'person.name',
        'person.FlatId',
        'person.Phone',
    ));
?>

您可以将DataProvider传递给视图,并在CgridView小部件中使用它,或者使用$model中的"search()"操作。

你可以像这样个性化关系列:

<?php 
$this->widget('zii.widgets.grid.CGridView',array(
    'id'=>'messagePerson-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'Id',
        'Mapid',
        array(
            'header'=>'Person Name', // Personalize column name
            'value'=>'$data->flat->person->Name',
            'htmlOptions'=>array('style'=>'width:10%;'), // Personalize html attributes
        ),
        'flat.person.FlatId', // Or directly with default relation name.
        'flat.person.Phone',
    ));
?>