Как определить текущую метку времени в yaml с помощью doctrine?

я попробовал следующий код yaml:

columns:
  created_time:
    type: timestamp
    notnull: true
    default: default CURRENT_TIMESTAMP

в выводимой инструкции sql поле обрабатывается как datetime вместо timestamp, который я не могу определить текущую метку времени в нем...

Если я настаиваю на использовании метки времени для хранения текущего времени, как это сделать в yaml?

7 ответов


вы можете использовать функциональность "Timestampable" в доктрине, например:

actAs:
  Timestampable:
    created:
      name: created_time
    updated:
      disabled: true
columns:
  created_time:
    type: timestamp
   notnull: true

Если вы готовы пожертвовать некоторой переносимостью (см. описание columnDefinition атрибут) для возможности использовать автоматическую метку времени инициализации MySQL (см. инициализация метки времени MySQL), то вы можете использовать следующее:

YAML так:

  created_time:
    type: datetime
    columnDefinition: TIMESTAMP DEFAULT CURRENT_TIMESTAMP

Аннотация:

@ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")

обратите внимание, что DEFAULT CURRENT_TIMESTAMP не работают так же, как Timestampable, и поэтому нельзя слепо или другую валюту.

  • В первую очередь, первый использует дату/время сервера БД, в то время как последний использует магию доктрины, которая вызывает функцию даты() PHP на вашем веб-сервере. Другими словами, это два разных способа получения даты / времени из двух совершенно разных источников часов. Вы можете быть на большой беде, если вы используете Timestampable, ваш веб сервер работает на другой машине, чем ваш сервер БД, и вы не держите часы в синхронизации, используя, например, NTP.

  • и DEFAULT CURRENT_TIMESTAMP нахождение в определении таблицы делает гораздо более согласованной модель базы данных IMHO, независимо от того, как вы вставляете данные (например, запуск INSERTs в командной строке DB engine), вы всегда будете получать текущую дату / время в столбце.

кстати, я также ищу ответ на CURRENT_TIMESTAMP проблема упоминается в первоначальном вопросе, так как это (по причинам, изложенным выше) мой предпочтительный способ хранения столбцов "timestamp".


Я предлагаю не использовать "default" для отметки времени вообще.

это принесет непредсказуемое состояние в yaml в вашем приложении. Это видео (PHP UK Conference 2016-Marco Pivetta-доктрина ORM хорошие практики и трюки) предоставляет дополнительные сведения об этой теме. Я предлагаю вам пройти через него и создать именованный конструктор.

public function createTimestamp(string $priority, int $priorityNormalized)
{
    $this->priority = $priority;
    $this->priorityNormalized = $priorityNormalized;
}

Я предлагаю быть без гражданства, удачи!


/**
 * @var int
 * @ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
 */
protected $created;

после ./vendor/bin/doctrine-module orm:schema-tool:update --force

обновление схемы базы данных... Схема базы данных успешно обновлена! "1" запросы были выполнены

и работать ./vendor/bin/doctrine-module orm:validate-schema

[Mapping] OK - файлы сопоставления верны. [База данных] FAIL - The схема базы данных не синхронизирована с текущим файлом сопоставления.

но не для синхронизировать, появляются


извините за некропостинг. Но я столкнулся с той же проблемой. Существует решение для доктрины 2 и postgreSql. Я использовал расширение Gemdo и добавил следующие строки:

 $evm = new \Doctrine\Common\EventManager();

        $timestampableListener = new \Gedmo\Timestampable\TimestampableListener;
        $timestampableListener->setAnnotationReader($cachedAnnotationReader);
        $evm->addEventSubscriber($timestampableListener);

YAML так:

created:
    type: date
    options:
        default: 0
        nullable: true
    gedmo:
        timestampable:
            on: create
updated:
    type: datetime
    options:
         default: 0
         nullable: true
    gedmo:
         timestampable:
             on: update

dump-sql:

ALTER TABLE users ADD created DATE DEFAULT CURRENT_DATE NOT NULL;
ALTER TABLE users ADD updated TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL;

вы можете использовать:

default: '<?php echo date('Y-m-d H:i:s') ?>'