CakePHP 分页器中的数字排序

Numeric sort in CakePHP paginator

我在 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 数据是这样的:

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

有什么想法吗?

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

因此,我在模型中使用了"beforeFind"回调方法。代码如下。

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;
}

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

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)'
);

但是,如果您使用别名实例化模型,这将引发错误。