Generally we need to show one or more fields from a model that is related to another model used in CGridView. For our case we will use two related models, which explain how to use model "A" fields in a CGridView that used model "B".
1) We have our two corresponding to the "A" and "B" models with their respective relations classes.
class TableA extends ActiveRecord { ... public function relations() { return array( 'tableB' => array(self::HAS_ONE, 'TableB', 'id'), ); } ... } class TableB extends ActiveRecord { ... public function relations() { return array( 'tableA' => array(self::BELONGS_TO, 'TableA', 'id'), ); } ... }
2) First, it is necessary to specify that the model will use the relationship defined above; Then, the comparison between the related field and a variable is defined; Finally, specify what will be the order for the field shown in CGriView.
class TableB extends ActiveRecord { ... public function search() { $criteria = new CDbCriteria(); $criteria->with = array('tableA'); ... $criteria->compare('tableA.name', Yii::app()->request->getParam('tableA_name'), true); ... $sort = new CSort(); $sort->attributes = array( 'tableA.name' => array( 'asc' => 'tableA.name ASC', 'desc' => 'tableA.name DESC' ), '*' ); return new CActiveDataProvider($this, array( 'criteria' => $criteria, 'sort' => $sort )); } ... }
3) In our CGridView, add the column specifying the name of the variable, the value and the filter will define the field that we will use to filter the column.
$this->widget('zii.widgets.grid.CGridView', array( ... 'dataProvider' => $model->search(), 'filter' => $model, 'columns' => array( array( 'name' => 'tableA.name', 'value' => '$data->tableA->name)', 'filter' => CHtml::textField('tableA_name', Yii::app()->request->getParam('tableA_name')), ), ... ), ... ));