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

时间:2016-03-09 20:09:02

标签: php mysql yii

我有CGridView在给定模型上调用search(AFAIK)来获取要显示的模型列表。是否可以通过调用$model->some_method()

的结果来排序所述视图的结果

我已经阅读了许多类似的问题,他们几乎都建议复制SQL中的代码,例如here。问题是some_method要复杂得多,不能用SQL编写。

我也读到了virtual attributes,这很合适,但如果我写的话:

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]:   找不到列:1054未知栏' t.somemethod'在'订单条款'。   执行的SQL语句是:SELECT * FROM use_case t ORDER BY   tsomemethod

我该怎么办?

1 个答案:

答案 0 :(得分:0)

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

请参阅yii1 doc http://www.yiiframework.com/doc/api/1.1/CSort#defaultOrder-detail

'attributes'=>array(
'price'=>array(
    'asc'=>'item.price',
    'desc'=>'item.price DESC',
    'label'=>'Item Price',
    'default'=>'desc',
),
'*',
)

然后,如果您需要对方法结果进行排序,只需将此结果设置为正确的列,并在数组中设置此列名称。

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

问题是默认顺序和一般的顺序是由sql而不是yii或php管理的子句然后如果你不能像sql元素那样定义方法你不能用它来订购在dataProvider中......本质上是sql管理器中的dataProvider。