我在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
未正确排序,它将其视为字符串。我想应用数字排序。
任何想法?
答案 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;
}