我有以下型号:
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
Model中设置了一个虚拟属性,如下所示
public function getFullName()
{
if($this->user_type=='admin')
return $this->admin->full_name;
else if($this->user_type=='editor')
return $this->editor->full_name;
}
Run Code Online (Sandbox Code Playgroud)
我可以fullName
在gridview中显示虚拟属性,但是如何在属性中添加过滤器并使其在gridview中可排序?
UPADTE 1:
我根据@Jon的答案更新了模型search()函数,如下所示
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,
));
} …
Run Code Online (Sandbox Code Playgroud)