【问题标题】:Sorting by a computed MySQL field in CakePHP 2.x pagination在 CakePHP 2.x 分页中按计算的 MySQL 字段排序
【发布时间】:2016-05-15 11:39:37
【问题描述】:

我有我需要的结果的 MySQL 查询:

SELECT `delivery_date` FROM `order_grids` ORDER BY str_to_date(`delivery_date`, "%b %d, %Y") DESC

由于我们有自定义 ORDER BY,所以我在 CakePHP 2.x 中实现它时遇到了问题。

通常,在正常字段排序的情况下,我们会执行以下操作。我有一个VARCHAR 类型字段delivery_date,它以Jan 21, 2015 格式存储日期,并且需要对该列进行排序。

我已经有了如上图所示的 MySQL 查询:

$this->Paginator->sort('delivery_date','Delivery Date');

请帮忙。

【问题讨论】:

  • 您可以使用虚拟字段。但是,将日期存储在 VARCHAR 中并不是一个好主意。
  • @InigoFlores - 实际上这是一个正在进行的项目,因此我们无法更改字段类型。你能解释一下我如何使用我的 sql 查询,以便它以 cake php 方式工作。
  • 我明白了。看看我的回答有没有帮助。

标签: php mysql cakephp pagination cakephp-2.x


【解决方案1】:

您可以通过创建虚拟字段来完成此操作。

由于虚拟字段在查找时的行为与常规字段非常相似,Controller::paginate() 也将能够按虚拟字段排序。

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

public function __construct($id = false, $table = null, $ds = null) {
    parent::__construct($id, $table, $ds);
    $this->virtualFields['delivery_date_proper'] = sprintf('STR_TO_DATE(%s.delivery_date, "%%b %%d, %%Y") ', $this->alias);
}

这将允许您在分页时按delivery_date_proper 排序。

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 2014-07-12
    • 2014-03-15
    • 2016-11-19
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    相关资源
    最近更新 更多