如何在 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() 无济于事。

一个可能的解决方案是执行以下操作:

  1. 创建一个 MySQL 用户定义函数 将罗马数字转换为阿拉伯数字。以下问题提供了一些:

    • MySQL Custom Function to Turn Roman Numeral Into Arabic

.

  1. 创建一个使用此函数的虚拟字段 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);
    }
    
  2. 使用此虚拟字段对分页中的结果进行排序。 CakePHP 可以处理这个问题,如 Cookbook 2.x 中所述:Pagination and virtual fields.

尽管以上方法有效,但如果将世纪存储在数字字段类型(或日期)中,也许会使事情变得更容易。在视图中可以轻松转换为罗马数字。