Php 通过模型上的特定方法订购CGridView

Php 通过模型上的特定方法订购CGridView,php,mysql,yii,Php,Mysql,Yii,我有一个CGridView,它调用给定模型上的search(AFAIK)来获取要显示的模型列表。是否可以通过调用$model->some_method()的结果对所述视图的结果进行排序 我读过很多类似的问题,它们都非常推荐复制SQL中的代码。问题是some_方法要复杂得多,不能用SQL编写 我也读过,这很合适,但如果我写: public function getSomeMethod() { ... } 然后使用: return new CActiveDataProvider($this

我有一个
CGridView
,它调用给定模型上的
search
(AFAIK)来获取要显示的模型列表。是否可以通过调用
$model->some_method()
的结果对所述视图的结果进行排序

我读过很多类似的问题,它们都非常推荐复制SQL中的代码。问题是
some_方法
要复杂得多,不能用SQL编写

我也读过,这很合适,但如果我写:

public function getSomeMethod() { ... }
然后使用:

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'pagination'=>false,
        'sort' => array(
            'attributes' => array('somemethod'),
            'defaultOrder' => array(
                'somemethod' => CSort::SORT_ASC,
            )
        )
    ));
它给了我:

CDbCommand无法执行SQL语句:SQLSTATE[42S22]: 未找到列:“order子句”中的1054未知列“t.somemethod”。 执行的SQL语句是:按顺序从
用例中选择*
t
somethod


我该怎么办?

defaultOrder数组内容必须是与CSort::ConstantValue相关的列数组

见yii1文件

然后,如果需要对方法结果进行排序,只需在适当的列中设置此结果,并在数组中设置此列名

如果不能像sql语句一样定义方法,则不能使用数据提供程序的顺序


问题是,默认顺序和通常的顺序子句是由sql管理的,而不是由yii或php管理的,那么如果不能定义类似sql元素的方法,就不能在dataProvider中使用它进行排序。。基本上是sql管理器中的数据提供程序。

您能详细介绍一下最后一条语句吗?我不太明白你所说的“简单地在适当的列中设置这个结果,在数组中设置这个列名”是什么意思。好的。例如:如果您的方法可以应用于列数据,那么您可以使用sql计算此值,并将其作为别名列返回,您可以在gridview中通过问题正文中的defalutOrder设置正确显示该列:“问题是,
某些方法
要复杂得多,无法用sql编写。”然后只是一个建议试试。。。在属性和defaultOrder中使用getSomeMethod而不是someMethod..显然getSomeMethod在模型中。。。对吗?就在我引用的部分之后,在问题中,我解释了我是如何尝试使用
getSomeMethod
的,以及我是如何尝试的,但没有成功。可能您需要CArrayDataProvider,因为您的sql查询/表中不存在您的属性。使用ArrayDataProvider,您可以使用真实和虚拟属性构建自定义数据集
'attributes'=>array(
'price'=>array(
    'asc'=>'item.price',
    'desc'=>'item.price DESC',
    'label'=>'Item Price',
    'default'=>'desc',
),
'*',
)