【问题标题】:yii sort by a custom attributeyii 按自定义属性排序
【发布时间】:2012-06-05 01:34:05
【问题描述】:

在我的 Vacation 模型中 Vac 我有这个功能

public function getVacCount(){

这个函数返回一个假期有多少天。

我想像这样向 cgridview 添加一个自定义列:

   <?php
    $this->widget('zii.widgets.grid.CGridView', array(
            ...
            array(
                'name' => 'count',
                'value' => '$data->getVacPeriod()'
            ),
            ...
        ),
    ));
    ?>

它工作正常。 但我不知道如何对这个自定义属性进行排序。 我尝试使用 CSort 但它不起作用。有什么想法吗?

【问题讨论】:

    标签: sorting yii virtual-attribute


    【解决方案1】:

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

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

    更多信息(和演示代码)可用here

    以下是我在自己网站上的操作示例:

    $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 就可以了。但这是正确的做法吗?
    • 这是虚拟属性/业务逻辑的张力之一。您不必将计数值保存在数据库中即可使其正常工作。如果您在查询中指定了 count() 值,那么它将起作用。
    • 更新了一个链接,显示如何更详细地执行此操作。
    • 正确。我刚刚发布了一些示例代码,展示了我如何为我的一个网站执行此操作。
    猜你喜欢
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2017-10-06
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多