Как определить текущую метку времени в yaml с учением? - PullRequest
14 голосов
/ 30 мая 2010

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

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

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

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

Ответы [ 7 ]

17 голосов
/ 14 ноября 2012

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

YAML:

  created_time:
    type: datetime
    columnDefinition: TIMESTAMP DEFAULT CURRENT_TIMESTAMP

Примечание:

@ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
13 голосов
/ 14 сентября 2010

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

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

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

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

11 голосов
/ 02 июня 2010

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

actAs:
  Timestampable:
    created:
      name: created_time
    updated:
      disabled: true
columns:
  created_time:
    type: timestamp
   notnull: true
0 голосов
/ 24 марта 2016

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

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

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

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

0 голосов
/ 24 марта 2016

Извините за некропостинг. Но я столкнулся с той же проблемой. Есть решение для доктрины 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;
0 голосов
/ 24 января 2014
/**
 * @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 - The Схема базы данных не синхронизирована с текущим файлом сопоставления.

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

0 голосов
/ 22 декабря 2011

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

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