gpt4 book ai didi

php - Yii 向 CGridView 中的虚拟属性添加过滤器并使其可排序

转载 作者:可可西里 更新时间:2023-11-01 12:17:28 25 4
gpt4 key购买 nike

我有以下模型:

User 列为 {id,user_name,password,user_type}

Admin 列 {id,user_id,full_name,.....etc}

Editor 列 {id, user_id,full_name,...etc}

关系是用户 : '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'),

编辑器:'user' => array(self::BELONGS_TO, 'User', 'user_id'),

现在我在 User 模型中设置了一个虚拟属性 fullName 如下

public function getFullName()

{

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

return $this->admin->full_name;

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

return $this->editor->full_name;


}

我可以在 gridview 中显示虚拟属性 fullName ,但是如何向该属性添加过滤器并使其在 gridview 中可排序?

更新 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,


));
}

管理员和编辑者的名字在 gridview 中正确显示。但是当我通过过滤器进行搜索时,会发生以下异常,

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。

最佳答案

您在这里尝试做的是有效地将计算列添加到结果集中。想象一下,在用于获取结果的 SQL 查询中,您将加入 AdminEditor 表,因此 Admin.full_nameEditor.full_name 是将涉及计算所需值的两列。

由于至少有一个 Admin.full_nameEditor.full_name 总是 NULL,因此计算最终值的公式将成为

COALESCE(Admin.full_name, Editor.full_name, '')

现在您有了计算公式,您需要执行以下步骤:

  1. 向您的模型添加读写列以接收计算列
  2. 创建一个 CDbCriteria 连接两个表并包含计算列
  3. 创建一个 CSort 来描述计算列应该如何影响记录顺序
  4. 创建一个使用这些条件和排序选项的 CActiveDataProvider
  5. 将数据提供程序提供给您的 CGridView

因此,首先向模型添加一个公共(public)属性:

public $calculatedName;

然后:

$criteria = new CDbCriteria(array(
'select' => array(
'*',
'COALESCE(Admin.full_name, Editor.full_name, \'\') AS calculatedName',
),
'with' => array('Admin', 'Editor'),
// other options here
));

$sort = new CSort;
$sort->attributes = array(
'calculatedName' => array(
'asc' => 'COALESCE(Admin.full_name, Editor.full_name, \'\')',
'desc' => 'COALESCE(Admin.full_name, Editor.full_name, \'\') DESC',
),
// other sort order definitions here
);

$dataProvider = new CActiveDataProvider('User', array(
'criteria' => $criteria,
'sort' => $sort,
));

最后,使用 $dataProvider 填充您的网格;使用 calculatedName 作为列名。

如果我在细节上有错误,我深表歉意,因为我实际上并没有运行它。

更新事实证明,如果您将 CDbCriteria.select 指定为字符串并且该字符串包含任何未用于分隔列的逗号 (例如用于分隔 COALESCE 的参数的逗号)。值得庆幸的是,CDbCriteria 还允许将列作为数组传递,从而解决了这个问题。我更新了上面的代码以匹配。

对于任何好奇的人,违规代码是this .

关于php - Yii 向 CGridView 中的虚拟属性添加过滤器并使其可排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10472732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com