CakePHP paginator中的数字排序

时间:2016-02-29 09:18:02

标签: mysql sorting cakephp cakephp-2.4 cakephp-2.x

我在CakePHP中有以下代码。

<th> <?php echo $this->Paginator->sort('standard_id', 'Standard'); ?></th>
<th> <?php echo $this->Paginator->sort('id'); ?> </th>
<th> <?php echo $this->Paginator->sort('title'); ?> </th>

standard_id的数据是这样的:

  • 第三
  • 第四
  • 第十
  • 11
  • ......等。

我的问题是standard_id未正确排序,它将其视为字符串。我想应用数字排序。

任何想法?

2 个答案:

答案 0 :(得分:1)

将以下内容添加到您的模型中:

public function __construct($id = false, $table = null, $ds = null) {
    parent::__construct($id, $table, $ds);
    $this->virtualFields['standard_id_numeric'] = sprintf('CAST(%s.standard_id as UNSIGNED)', $this->alias);
}

现在您应该可以按standard_id_numeric排序。

或者,您可以将虚拟字段声明为:

public $virtualFields = array(
    'standard_id_numeric' => 'CAST(Standard.standard_id as UNSIGNED)'
);

但是,如果使用别名实例化模型,则会抛出错误。

答案 1 :(得分:0)

在mysql中查询自然排序是: SELECT column_name FROM table_name ORDER BY CAST(column_name AS UNSIGNED)ASC;

因此,我使用&#34; beforeFind&#34;模型中的回调方法。代码如下所示。

public function beforeFind($queryData) {
    if(isset($queryData['sort'])){
        if($queryData['sort'] == "standard" && $queryData['direction']=="asc"){
            $queryData['order'][0] = array("CAST(Standard.standard AS UNSIGNED)" => "ASC");
        }elseif($queryData['sort'] == "standard" && $queryData['direction']=="desc"){
            $queryData['order'][0] = array("CAST(Standard.standard AS UNSIGNED)" => "DESC");
        }
    }

    return $queryData;
}