如何在 Cakephp 中使用分页对包含罗马数字的列进行排序 2.x
How to sort a column holding roman numbers using Pagination in Cakephp 2.x
我有一个字段(单选按钮)到select一个世纪。
因此,当我在视图中显示我的字段列表时,我可以对列进行排序(ASC 或 DESC),但罗马数字是具有以下选项的字符串:
(XVI, XVII, XVIII, XIX, XX, XXI)
有什么方法可以告诉分页器使用自定义 usort
函数,但只针对该列?
我已经有一个转换和排序罗马字的函数,但是如何在视图中将它与分页排序函数一起使用?
CakePHP 2.x.
您必须在数据库级别进行排序,因此 usort()
无济于事。
一个可能的解决方案是执行以下操作:
创建一个 MySQL 用户定义函数 将罗马数字转换为阿拉伯数字。以下问题提供了一些:
- MySQL Custom Function to Turn Roman Numeral Into Arabic
.
创建一个使用此函数的虚拟字段 return 数字格式的世纪:
public function __construct($id = false, $table = null, $ds = null) {
parent::__construct($id, $table, $ds);
$this->virtualFields['century_number'] = sprintf('convert_to_number(%s.century))', $this->alias);
}
使用此虚拟字段对分页中的结果进行排序。
CakePHP 可以处理这个问题,如 Cookbook 2.x 中所述:Pagination and virtual fields.
尽管以上方法有效,但如果将世纪存储在数字字段类型(或日期)中,也许会使事情变得更容易。在视图中可以轻松转换为罗马数字。
我有一个字段(单选按钮)到select一个世纪。
因此,当我在视图中显示我的字段列表时,我可以对列进行排序(ASC 或 DESC),但罗马数字是具有以下选项的字符串:
(XVI, XVII, XVIII, XIX, XX, XXI)
有什么方法可以告诉分页器使用自定义 usort
函数,但只针对该列?
我已经有一个转换和排序罗马字的函数,但是如何在视图中将它与分页排序函数一起使用?
CakePHP 2.x.
您必须在数据库级别进行排序,因此 usort()
无济于事。
一个可能的解决方案是执行以下操作:
创建一个 MySQL 用户定义函数 将罗马数字转换为阿拉伯数字。以下问题提供了一些:
- MySQL Custom Function to Turn Roman Numeral Into Arabic
.
创建一个使用此函数的虚拟字段 return 数字格式的世纪:
public function __construct($id = false, $table = null, $ds = null) { parent::__construct($id, $table, $ds); $this->virtualFields['century_number'] = sprintf('convert_to_number(%s.century))', $this->alias); }
使用此虚拟字段对分页中的结果进行排序。 CakePHP 可以处理这个问题,如 Cookbook 2.x 中所述:Pagination and virtual fields.
尽管以上方法有效,但如果将世纪存储在数字字段类型(或日期)中,也许会使事情变得更容易。在视图中可以轻松转换为罗马数字。