Paginator在afterFind字段上排序

时间:2014-09-03 15:21:32

标签: php mysql cakephp pagination cakephp-2.5

我试图显示我们客户的各个时区列表以及从中获取的当地时间。现在在我的客户端模型中,我有以下函数(doAfterFind),它只是afterFind的包装器,它提供了一致的格式。

public function doAfterFind($result = array()) {
    $result = parent::doAfterFind($result);

    if (!empty($result['timezone'])) {
        App::uses('CakeTime', 'Utility');

        $result['local_time'] = CakeTime::format(
            VIEW_DATE_FORMAT,
            strtotime('now'),
            null,
            $result['timezone']
        );
    }

    return $result;
}

local_time字段在find()之后正确放置在模型中。我试图将其实现为虚拟字段,因为它需要进行排序。问题是我无法根据当前时间和客户的时区计算出如何计算时间。我在模型的构造函数中尝试了相同的操作并将其添加到virtualFields数组中,但在构造函数调用期间时区不可用 - 因为没有加载ID或任何内容。

有没有人知道让MySQL计算这个的方法,或者使用我已经拥有的东西但是作为与Paginator sort()兼容的虚拟字段?我可以在视图中格式化日期显示,但需要本地时间列可以排序。

注意: 我的时区存储为区域设置名称(America / New_York等)。 常量VIEW_DATE_FORMAT只是date()格式字符串F jS, Y - g:i A

1 个答案:

答案 0 :(得分:0)

假设您具有对正在使用的服务器的shell访问权限,请参阅有关设置mysql服务器的信息,以便能够根据时区名称进行时区转换:http://blog.mozilla.org/it/2012/11/16/converting-timezone-specific-times-in-mysql/

完成设置后,您应该可以创建一个虚拟字段:

$this->virtualFields['local_time'] = "CONVERT_TZ(NOW(), 'UTC', Client.timezone)";

(如果您的服务器未设置为UTC,则您必须将第二个参数替换为您服务器的时区。)

结果可能不会按照您希望的方式进行格式化,但您可以在afterFind中进行格式化。