最新消息: 新版网站上线了!!!

Yii:多表关联 relations

8个步骤实现Yii多表关联。
 
 
      有两个表:产品表product、点评表dianping。通过点评表对产品进行点评。
前提:两表存在关联关系(如通过外键关联)dianping的外键为pro_id,对应product中的id。
需求:实现:在搜索列表页面,dianping表的pro_id,想到的是产品名。
 
dianping表的modelsclass Dianping extends CActiveRecord { 
    ... 
}
 
 
第一步:在relations方法中:定义关联关系   (models中)
    public function relations(){
        return array(
            'pro' => array(self::BELONGS_TO, 'Product', 'pro_id'),
        );
    }gii生成models时,已经自动生成
第二步:  为模型添加属性      (models中)
class Dianping extends CActiveRecord {  
    public $pro_name; 
    ... 
}
第三步:  在搜索规则rules()中添加新属性   (models中)
class Dianping extends CActiveRecord {
  ...
  public function rules() {
    return array(
      ...
      array( 'xxx,yyy,pro_name', 'safe', 'on'=>'search' ),
    );
  }
}
第四步:   设置显示的样式   (models中)
    public function attributeLabels()
    {
        return array(
            'id' => 'ID',
            'name' => '点评标题',
            'pro_name' => '产品名',
        );
    }
第五~七步:   配置search()方法   (models中)
    public function search(){
        $criteria=new CDbCriteria;
        $criteria->with = array('pro');   ---》 第五步: 使用with进行积极关联查询
     
        $criteria->compare('id',$this->id);
        $criteria->compare('name',$this->name,true);
        ……                // pro与relations()定义的相对应,proname是关系表中的字段
       $criteria->compare('pro.proname', $this->pro_name, true); 第六步: 设置新添加属性$pro_name对应的查询字段
        return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
            'sort'=>array(
                'attributes'=>array(   第七步: 设置新添加的属性可以实现排序功能,并设置默认排序
                    'pro_name'=>array(
                        'asc'=>'pro.proname',
                        'desc'=>'pro.proname DESC',
                    ),
                    '*',
                ),
            ),
        ));
    }
 
第八步:  在views中接收值    (views中:admin.php)
<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'dianping-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'id',
        'name',
        ……
        array( 'name'=>'pro_name', 'value'=>'$data->pro->proname' ),
 
        array(
            'class'=>'CButtonColumn',
        ),
    ),
)); ?>
 
结束!!!!!!
 
参考:
http://www.yiiframework.com/wiki/281/searching-and-sorting-by-related-model-in-cgridview/

转载请注明:谷谷点程序 » Yii:多表关联 relations