Yii добавить фильтр к виртуальному атрибуту в CGridView и сделать его сортируемым

У меня есть следующие модели:

Userсо столбцами {id, user _name, password, user _type}

Adminсо столбцами {id, user _id,full _name,...etc}

Editorсо столбцами {id, user _id,full _name,...etc}

и отношенияUser:'admin' => array(self::HAS_ONE, 'Admin', 'user_id'),'editor' => array(self::HAS_ONE, 'Editor', 'user_id'),

Admin:'user' => array(self::BELONGS_TO, 'User', 'user_id'),

Editor:'user' => array(self::BELONGS_TO, 'User', 'user_id'),

Теперь я настроил виртуальный атрибут fullNameв Userмодели, как показано ниже

public function getFullName()

{

    if($this->user_type=='admin')

        return $this->admin->full_name;

    else if($this->user_type=='editor')

        return $this->editor->full_name;


}

Я могу показать виртуальный атрибут fullNameв представлении сетки, но как добавить фильтр к атрибуту и ​​сделать это сортируется в gridview?

UPADTE 1:

Я обновил функцию поиска моделей ()в соответствии с ответом @Jon, как показано ниже

    public function search()
        {


            $criteria=new CDbCriteria;
            $criteria->select=array('*','COALESCE( editor.full_name,admin.first_name, \'\') AS calculatedName');
            $criteria->with=array('editor','admin');
            $criteria->compare('calculatedName',$this->calculatedName,true);
            $criteria->compare('email',$this->email,true);
            $criteria->compare('user_type',$this->user_type);

            return new CActiveDataProvider($this, array(
                'criteria'=>$criteria,


));
    }

Имена администраторов и редакторов правильно отображаются в представлении сетки. Но когда я выполняю поиск по фильтру, возникает следующее исключение:

CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'calculatedName' in 'where clause'. The SQL statement executed was: SELECT COUNT(DISTINCT `t`.`id`) FROM `user` `t`  LEFT OUTER JOIN `editor` `editor` ON (`editor`.`user_id`=`t`.`id`)  LEFT OUTER JOIN `admin` `admin` ON (`admin`.`user_id`=`t`.`id`)  WHERE (calculatedName LIKE :ycp0) (C:\xampplite\htdocs\yii\framework\db\CDbCommand.php:528)</p><pre>#0 C:\xampplite\htdocs\yii\framework\db\CDbCommand.php(425):

Как я могу избавиться от этого?

ОБНОВЛЕНИЕ 2 :Моя ошибка. Он отлично работает, когда я изменил строку

$criteria->compare('calculatedName',$this->calculatedName,true);

на

$criteria->compare('COALESCE( editor.full_name,admin.first_name, \'\')',$this->calculatedName,true);

и, кстати, спасибо @Jon.

9
задан dInGd0nG 7 May 2012 в 10:34
поделиться