У меня есть следующие модели:
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.