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
数据是这样的:
- 第三
- 第四
- 第 10
- 第 11
- ...等等
我的问题是 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)'
);
但是,如果您使用别名实例化模型,这将引发错误。
见
- 食谱2.x:虚拟字段:Pagination and virtual fields。
我在 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
数据是这样的:
- 第三
- 第四
- 第 10
- 第 11
- ...等等
我的问题是 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)'
);
但是,如果您使用别名实例化模型,这将引发错误。
见
- 食谱2.x:虚拟字段:Pagination and virtual fields。