yii cgridview关系多层次

时间:2013-09-19 15:59:55

标签: yii cgridview database-relations

我有4张订单付款用户和个人资料表。付款与订单有belongs_to的关系。订单与用户和用户has_many配置文件具有belongs_to关系。

在cgridview中显示付款时,我需要显示存储在个人资料中的用户的名字和姓氏。

我尝试使用:

$data->order->user->profiles->firstname;

还尝试将参数firstname添加到Payment的模型类中,并尝试将setter方法创建为:

public function getFirstname(){
    if ($this->_firstname=== null && $this->order !== null) {
                $this->_firstname = $this->order->user->profiles->firstname;
            }
            return $this->_firstname ;
    }
    public function setFirstname($value){
        $this->_firstname = $value ;
    }

但我未能得到理想的结果。

编辑:搜索方法具有以下代码:

public function search() {
        $criteria = new CDbCriteria;
        $criteria->with = array('order.user.profiles') ;
. . . .
        $criteria->compare('firstname', $this->_firstname, true);

. . . .     
        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

2 个答案:

答案 0 :(得分:1)

我建议使用“通过”关系,因为它可以让生活更轻松。您所要做的就是,转到您的“付款”模式并添加以下关系,

public function relations()
{
    return array(
        'order' => array(self::BELONGS_TO, 'Orders', 'order_id'),
        'user'=>array(
            self::BELONGS_TO,'User',array('user_id'=>'id'),'through'=>'order'
        ),
        'profiles'=>array(
            self::HAS_MANY,'Profile',array('id'=>'user_id'),'through'=>'user'
        ),
    );
}

在网格中,您可以使用

访问first_name
$data->profiles[0]->firstname

答案 1 :(得分:0)

在模型中试试这个:

public function getFirstname(){
    return $this->order->user->profiles->firstname;
}

并在网格中:

$data->firstname;