Вот тут мне помогли на другом форме, ссылку не могу дать, форум запрещает, мощная защита.
Все таки мой уровень не позволяет понимать такие вещи на словах, нужны реальные примеры, я совсем незнаю Yii, начал его изучение как раз с CGridView.
Боязно конечно, если будет много сложных таблиц и они начнут выдавать ошибки при поиске и т.д.
А через CDbCriteria + join тут никак только модели AR?
Вот что мне помогло, файл из цельного примера.
Кому нужно, ищите в поисковиках, по кускам приведенного кода, найдется.
CREATE TABLE `city` (
`id` int(11) NOT NULL auto_increment,
`name_city` varchar(64) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;
INSERT INTO `city` VALUES (1, 'Москва');
INSERT INTO `city` VALUES (2, 'Санкт-Петербург');
INSERT INTO `city` VALUES (3, 'Выборг');
CREATE TABLE `name` (
`id` int(11) NOT NULL,
`name_person` varchar(64) NOT NULL,
`id_city` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `id_city` (`id_city`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
INSERT INTO `name` VALUES (0, 'Иван', 1);
INSERT INTO `name` VALUES (1, 'Михаил', 2);
INSERT INTO `name` VALUES (2, 'Алексей', 3);
INSERT INTO `name` VALUES (3, 'Вячеслав', 2);
INSERT INTO `name` VALUES (4, 'Даша', 1);
Модель Name
class name extends CActiveRecord
{
/**
* The followings are the available columns in table 'name':
* @var integer $id
* @var string $name_person
* @var integer $id_city
*/
/**
* Returns the static model of the specified AR class.
* @return CActiveRecord the static model class
*/
public static function model($className=__CLASS__)
{
return parent::model($className);
}
/**
* @return string the associated database table name
*/
public function tableName()
{
return 'name';
}
public function rules()
{
return array(
// The following rule is used by search().
array('id, name_person, nameCity, nameCity1', 'safe', 'on'=>'search'),
);
}
public function attributeLabels()
{
return array(
'id' => 'Id',
'name_person' => 'Name',
'nameCity' => 'City',
'nameCity1' => 'City1',
);
}
/**
* Отношения name с другими таблицами
*/
public function relations()
{
return array(
'nameCity'=>array(self::BELONGS_TO, 'city', 'id_city'),
'nameCity1'=>array(self::BELONGS_TO, 'city', 'id_city'),
);
}
/**
* Retrieves a list of models based on the current search/filter conditions.
* @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
*/
public function search()
{
$criteria=new CDbCriteria;
$criteria->compare('t.id',$this->id);
$criteria->compare('name_person',$this->name_person,true);
$criteria->with=array('nameCity','nameCity1'); // жадная загрузка
//$criteria->with=array('nameCity1'); // жадная загрузка
$criteria->compare('nameCity.name_city',$this->nameCity,true); // поиск по связанному полю
$criteria->compare('nameCity1.name_city',$this->nameCity1,true); // поиск по связанному полю
return new CActiveDataProvider('name', array(
'criteria'=>$criteria,
'sort'=>array('attributes'=>array(
'nameCity'=>array( // сортировка по связанном полю
'asc' => $expr='nameCity.name_city',
'desc' => $expr.' DESC',
),
'nameCity1'=>array( // сортировка по связанном полю
'asc' => $expr='nameCity1.name_city',
'desc' => $expr.' DESC',
),
'id'=>array( // сортировка по id
'asc' => $expr='t.id', // t.id написано потому что у нас id есть в двух таблицах
'desc' => $expr.' DESC',
),
'name_person', // не требует подробного описания т.к. это поле индивидуально для двух таблиц
)),
'pagination'=>array(
'pageSize'=>40, // количество записей на странице
),
));
}
}
View
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'name-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'name_person',
array(
'name'=>'nameCity',
'value'=>'$data->nameCity->name_city',
'sortable'=>true,
),
array(
'name'=>'nameCity1',
'value'=>'$data->nameCity1->name_city',
'sortable'=>true,
),
array(
'class'=>'CButtonColumn',
),
),
));