【问题标题】:sort value from function in cgridview从 cgridview 中的函数排序值
【发布时间】:2014-04-21 08:15:02
【问题描述】:

我有一张表,其中一列具有来自函数的值

<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'camera-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
    array(
        'name'=>'location', 
        'header'=>'Location', 
        'value'=>'$data->location->name'
    ),
    array(
        'header'=>'Last Date',
        'value'=>'$data->myfunction($data->location->name)'
    ),
),)); ?>

我的问题是:

  1. 如何对列 Last Date 进行排序?
  2. Last Date 有可能为空。那么,如果我想显示 Last Date 不为 null 的行,我应该怎么做?

之前谢谢:)

【问题讨论】:

  • 你的意思是默认排序?
  • @hoangvu68 我的意思是,我可以按表中的最后日期(从函数返回)排序,因为我可以根据模型对另一列进行排序

标签: php sorting yii cgridview


【解决方案1】:

排序将如下所示:

    $sort = new CSort;
    $criteria->with = array(
        'location'
    );

    /* Sort criteria */
    $sort->attributes = array(
        'col_name'=>array(
            'asc'=>"location.date asc",
            'desc'=>"location.date desc",
        ),
        '*',
    );

    /* Default Sort Order*/
    $sort->defaultOrder= array(
        'col_name'=>CSort::SORT_ASC,
    );

    return new CActiveDataProvider($this, array(
        'pagination'=>array('pageSize'=>20),
        'criteria'=>$criteria,
        'sort'=>$sort,
    ));

而NULL你需要检查行值:

  'value'=>'$data->location ? $data->myfunction($data->location->name) : ""'

如果数据库中没有可以排序的列,则应从数据库中选择所有记录,然后将它们手动排序并放入 CArrayDataProvider。

【讨论】:

  • 如果我没有location.date怎么办?最后日期来自 myfunction()
  • 这意味着你不能在mysql中对行进行排序?
  • 例如,myfunction(location) return '21 Apr 2014',此值为 Last Date 列。我想在表中,我可以按 Last Date 排序,而不是来自数据库。
  • 你应该从数据库中选择所有记录,然后手动排序并放入CArrayDataProvider
【解决方案2】:

正如@Alex 所说,在不编辑数据库的情况下,唯一的解决方案是从数据库中读取所有记录,将您的函数应用于每个模型,然后手动对它们进行排序。这不仅会占用大表的内存,而且效率也非常低,因为 a)如果您使用分页,您将丢弃数据库中的大部分记录,并且 b)您的自定义排序方法很可能比您的数据库的。

根据您提供的信息,我的解决方案是在您的表中添加一个附加字段并将其设置为$data-&gt;myfunction($data-&gt;location-&gt;name)' 的结果。带有defaultOrder 集的CActiveDataProvider 可用于馈送CGridView

【讨论】:

    【解决方案3】:

    最后,我找到了这个解决方案。 总的来说,我必须将我的自定义变量作为 SQL 查询。因此,我可以像数据库中的其他变量一样对自定义变量进行排序或搜索。

    在我的模型中,

    1. 声明新变量 public $LAST_DATE;

    2. 添加 $criteria

    $criteria->select = array('*','COALESCE(location.name, \'\') AS LAST_DATE'); $criteria->order = 'LAST_DATE DESC'; return new CActiveDataProvider($this, array( 'criteria'=>$criteria, 'sort'=>array( 'defaultOrder'=>'LAST_DATE DESC', 'attributes' => array( 'LAST_DATE'=>array( 'asc'=>'COALESCE(location.name, \'\')', 'desc'=>'COALESCE(location.name, \'\') DESC', ), '*', ), ),

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 2011-08-29
      相关资源
      最近更新 更多