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

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

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

YAML:

  created_time:
    type: datetime
    columnDefinition: TIMESTAMP DEFAULT CURRENT_TIMESTAMP

Аннотация:

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

/**
 * @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

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

Но FAIL для синхронизации появляется

Ответ 6

Извините за некропостинг. Но я столкнулся с той же проблемой. Существует решение для доктрины 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

дамп-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;

Ответ 7

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

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