Многоуровневое отношение yii cgridview

У меня есть 4 таблицы оплаты заказов пользователей и профилей. Платежи имеют отношение belongs_to к заказу. Заказ имеет отношение belongs_to с пользователем, а у пользователя есть_много профилей.

При отображении платежей в cgridview мне нужно отобразить имя и фамилию пользователя, хранящиеся в профиле.

Я пытался использовать:

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

Также попытался добавить имя параметра в класс модели Payment и попытался создать метод установки как:

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,
        ));
    }

person friedFingers    schedule 19.09.2013    source источник


Ответы (2)


Я бы предложил использовать отношение «сквозь», так как это упрощает жизнь. Все, что вам нужно сделать, это перейти к модели «платежи» и добавить следующие отношения:

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
person Balaji Viswanath    schedule 19.09.2013

попробуйте это в модели:

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

и в сетке:

$data->firstname;
person Olegacy    schedule 19.09.2013