CakePHP 将 MySQL 日期时间转换为 Unix 时间戳

CakePHP Convert MySQL DateTime to Unix Timestamp

我在尝试 select DATETIME 字段并使用 UNIX_TIMESTAMP() 函数时遇到问题。

这是我的自定义查找器:

    public function findApi(Query $query, array $options) {
      $unixTimestamp = $query->func()->unix_timestamp(['sample_time' => 'identifier']);

      return $query->select([
                      'sample_time' => $unixTimestamp,
                      'min'         => 'min_psi',
                      'max'         => 'max_psi',
                    ])
                    ->where([
                      'machine_id' => $options['machine_id'],
                      'sample_time >=' => $options['start'],
                      'sample_time <=' => $options['end']
                    ]);
    }

但是当我尝试获取结果集并且我的采样时间是 false:

时,我不断收到 "failed to parse" 警告
Warning (2): DateTimeImmutable::modify(): Failed to parse time string (1564618674) at position 8 (7): Unexpected character [CORE/src/Database/Type/DateTimeType.php, line 188]
Code Context

            if ($previousHandler) {
                return $previousHandler($code, $message, $file, $line, $context);
            }

$value = '1564618674'
$driver = object(Cake\Database\Driver\Mysql) {

    'connected' => true

}
$instance = object(Cake\I18n\FrozenTime) {

    'time' => '2019-10-23T17:01:38+00:00',
    'timezone' => 'UTC',
    'fixedNowTime' => false

}

Cake\Core\BasePlugin::{closure}() - ROOT/vendor/cakephp/debug_kit/config/bootstrap.php, line 42
DateTimeImmutable::modify() - [internal], line ??
Cake\Database\Type\DateTimeType::toPHP() - CORE/src/Database/Type/DateTimeType.php, line 188
Cake\Database\FieldTypeConverter::__invoke() - CORE/src/Database/FieldTypeConverter.php, line 135
Cake\Database\Statement\CallbackStatement::fetch() - CORE/src/Database/Statement/CallbackStatement.php, line 59
Cake\ORM\ResultSet::_fetchResult() - CORE/src/ORM/ResultSet.php, line 487
Cake\ORM\ResultSet::valid() - CORE/src/ORM/ResultSet.php, line 277
Cake\ORM\ResultSet::first() - CORE/src/ORM/ResultSet.php, line 299
Cake\ORM\Query::first() - CORE/src/Datasource/QueryTrait.php, line 471
App\Controller\Api\WaterPressuresController::getJsonResults() - APP/Controller/Api/WaterPressuresController.php, line 64
App\Controller\Api\WaterPressuresController::index() - APP/Controller/Api/WaterPressuresController.php, line 22
Cake\Controller\Controller::invokeAction() - CORE/src/Controller/Controller.php, line 610
Cake\Http\ActionDispatcher::_invoke() - CORE/src/Http/ActionDispatcher.php, line 120
Cake\Http\ActionDispatcher::dispatch() - CORE/src/Http/ActionDispatcher.php, line 94
Cake\Http\BaseApplication::__invoke() - CORE/src/Http/BaseApplication.php, line 235
Cake\Http\Runner::__invoke() - CORE/src/Http/Runner.php, line 65
Cake\Routing\Middleware\RoutingMiddleware::__invoke() - CORE/src/Routing/Middleware/RoutingMiddleware.php, line 162

/src/Controller/Api/WaterPressuresController.php (line 66)

[
    'sample_time' => false,
    'min_val' => (int) 75,
    'max_val' => (int) 91
]

看起来 CakePHP 正在尝试使用 FieldTypeConverter 转换字段。如何防止转换以便我可以使用 UNIX_TIMESTAMP 函数并将结果作为整数而不是日期时间?

您正在 select 为现有列创建 unix 时间戳,它属于某种 date/time 类型,但 CakePHP 的 date/time 类型转换器不支持 unix 时间戳,它需要 date/time-ish 格式的值,如 Y-m-d H:i:s.

您可以通过简单地在 select 列表中使用不同的别名来解决这个问题,例如:

'sample_timestamp' => $unixTimestamp,

或通过重新映射查询类型:

$query->getSelectTypeMap()->addDefaults(['sample_time' => 'integer']);

我建议您也考虑在实际需要时转换 PHP 级别的值,即 ORM 为您的 date/time-ish 列创建的 date/time 对象有一个 getTimestamp() 方法,所以你可以这样做:

$entity->sample_time->getTimestamp()