【问题标题】:Order a CGridView by a specific method on a model通过模型上的特定方法订购 CGridView
【发布时间】:2016-03-09 20:09:02
【问题描述】:

我有一个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 t.somemethod

我该怎么办?

【问题讨论】:

  • 可能您需要 CArrayDataProvider,因为您的属性在您的 sql 查询/表中不存在。使用 ArrayDataProvider,您可以构建具有真实和虚拟属性的自定义数据集

标签: php mysql yii


【解决方案1】:

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

见 yii1 文档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语句一样定义方法,你就不能使用dataprovider的顺序

问题是默认顺序和一般顺序是由 sql 管理的子句,而不是由 yii 或 php 管理,那么如果你不能定义像 sql 元素这样的方法,你就不能在 dataProvider 中使用它来排序。本质上是 sql manager 中的 dataProvider。

【讨论】:

  • 能否请您扩展最后一条语句?我不太明白“只需将此结果设置在正确的列中并将此列名称设置在数组中”的意思。
  • 好的。例如:如果您的方法可以应用于列数据,那么您可以使用 sql 计算此值并像别名列一样返回它,您可以在 gridview 中显示,通过 defalutOrder 设置正确排序
  • 来自问题正文:“问题是some_method要复杂得多,不能用SQL编写。”
  • 然后只是一个建议尝试...在属性和 defaultOrder 中使用 getSomeMethod 而不是 someMethod ..显然 getSomeMethod 在模型中...对吗?
  • 在我引用的部分之后,在问题中,我解释了我是如何尝试使用getSomeMethod 以及我是如何尝试的,但它没有奏效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2012-11-09
  • 2017-12-07
  • 2022-01-21
  • 2021-07-13
相关资源
最近更新 更多