CakePHP конвертировать MySQL DateTime в Unix Timestamp - PullRequest
0 голосов
/ 23 октября 2019

У меня проблема с построителем запросов CakePHP, пытающимся выбрать поле 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 :

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 и получать результаты в виде целого числа вместо даты-времени?

1 Ответ

1 голос
/ 23 октября 2019

Вы выбираете метку времени Unix для существующего столбца, который имеет некоторый тип даты / времени, но конвертер типа даты / времени в CakePHP не поддерживает метки времени Unix, он ожидает значения даты / времени в таких форматах, какY-m-d H:i:s.

Вы можете обойти это, просто используя другой псевдоним в списке выбора, например что-то вроде:

'sample_timestamp' => $unixTimestamp,

или переназначая тип для запроса:

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

Я бы посоветовал вам также обратить внимание на преобразование значения на уровне PHP, когда это действительно необходимо, для объектов даты / времени, которые ORM создает для столбца даты / времени, есть метод getTimestamp(),так что вы могли бы сделать:

$entity->sample_time->getTimestamp()
...