Sorting yii按自定义属性排序

Sorting yii按自定义属性排序,sorting,yii,virtual-attribute,Sorting,Yii,Virtual Attribute,在我的假期模型Vac中,我有这个功能 public function getVacCount(){ 此函数返回一个假期有多少天 我想向cgridview添加一个自定义列,如下所示: <?php $this->widget('zii.widgets.grid.CGridView', array( ... array( 'name' => 'count',

在我的假期模型Vac中,我有这个功能

public function getVacCount(){
此函数返回一个假期有多少天

我想向cgridview添加一个自定义列,如下所示:

   <?php
    $this->widget('zii.widgets.grid.CGridView', array(
            ...
            array(
                'name' => 'count',
                'value' => '$data->getVacPeriod()'
            ),
            ...
        ),
    ));
    ?>
它很好用。 但我不知道如何根据这个自定义属性进行排序。
我尝试使用CSort,但它不起作用。有什么想法吗?

要使用CSort进行排序,需要将休假函数转换为SQL查询,然后将结果存储在模型中的公共变量中

CSort只适用于SQL语句/函数,因为在下面它使用ORDER BY进行所有排序

更多信息和演示代码可用

下面是我在我的一个网站上做这件事的一个例子:

$criteria->select = array(
        "*",
        new CDbExpression("IF(survey.RequestDate, survey.RequestDate, SurveyCompleteDate) AS SurveyDate")
    );
这样我就可以进行这种类型的筛选:

return new CActiveDataProvider($this, array(
    'criteria' => $criteria,
    'sort'=>array(
        'attributes'=>array(
            'SurveyDate' => array(
                'asc' => 'SurveyDate',
                'desc' => 'SurveyDate DESC',
            ),
            '*',
        ),
    ),
);

注意:您还需要在模型中定义一个公共变量来保存正在执行的CDbExpression的结果。我的名为SurveyDate。

要使用CSort进行排序,需要将休假函数转换为SQL查询,然后将结果存储在模型中的公共变量中

CSort只适用于SQL语句/函数,因为在下面它使用ORDER BY进行所有排序

更多信息和演示代码可用

下面是我在我的一个网站上做这件事的一个例子:

$criteria->select = array(
        "*",
        new CDbExpression("IF(survey.RequestDate, survey.RequestDate, SurveyCompleteDate) AS SurveyDate")
    );
这样我就可以进行这种类型的筛选:

return new CActiveDataProvider($this, array(
    'criteria' => $criteria,
    'sort'=>array(
        'attributes'=>array(
            'SurveyDate' => array(
                'asc' => 'SurveyDate',
                'desc' => 'SurveyDate DESC',
            ),
            '*',
        ),
    ),
);

注意:您还需要在模型中定义一个公共变量来保存正在执行的CDbExpression的结果。我的名字叫SurveyDate。

这并不能回答我的问题。当然,我可以使用beforeSave并将计数值存储在数据库表中,然后CSort将起作用。但这是正确的做法吗?这是虚拟属性/业务逻辑的紧张关系之一。不过,您不必将计数值保存在数据库中以使其正常工作。如果您在查询中指定了计数值,则它将起作用。更新了一个链接,该链接显示了如何更详细地执行此操作。正确。我刚刚发布了一些示例代码,显示了我如何为我的一个站点执行此操作。这并没有回答我的问题。当然,我可以使用beforeSave并将计数值存储在数据库表中,然后CSort将起作用。但这是正确的做法吗?这是虚拟属性/业务逻辑的紧张关系之一。不过,您不必将计数值保存在数据库中以使其正常工作。如果您在查询中指定了计数值,则它将起作用。更新了一个链接,该链接显示了如何更详细地执行此操作。正确。我刚刚发布了一些示例代码,展示了我如何为我的一个网站做到这一点。