Ответ 1
В доктрине вы можете использовать функциональность "Timestampable", например:
actAs:
Timestampable:
created:
name: created_time
updated:
disabled: true
columns:
created_time:
type: timestamp
notnull: true
Я попробовал следующий код yaml:
columns:
created_time:
type: timestamp
notnull: true
default: default CURRENT_TIMESTAMP
В выведенном выражении sql поле обрабатывается как datetime, а не timestamp, что я не могу определить текущую временную метку в нем...
Если я настаиваю, чтобы использовать временную метку для хранения текущего времени, как это сделать в yaml?
В доктрине вы можете использовать функциональность "Timestampable", например:
actAs:
Timestampable:
created:
name: created_time
updated:
disabled: true
columns:
created_time:
type: timestamp
notnull: true
Если вы готовы пожертвовать некоторой переносимостью (см. описание атрибута columnDefinition) для возможности использования MySQL автоматическая инициализация TIMESTAMP (см. инициализация временной метки 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 date() на вашем веб-сервере. Другими словами, это два разных способа получения даты/времени из двух совершенно разных источников синхронизации. У вас могут быть большие проблемы, если вы используете Timestampable, ваш веб-сервер работает на другой машине, чем ваш сервер БД, и вы не синхронизируете свои часы с использованием, например, NTP.
Кроме того, DEFAULT CURRENT_TIMESTAMP
, находящийся в определении таблицы, создает гораздо более согласованную модель базы данных IMHO, как независимо от того, как вы вставляете данные (например, запустив INSERT
в командной строке ядра БД), вы всегда будете получать текущую дату/время в столбце.
Кстати, я также ищу ответ на проблему CURRENT_TIMESTAMP
, упомянутую в начальном вопросе, так как это (по причинам, изложенным выше) мой предпочтительный способ хранения столбцов "timestamp".
Я предлагаю не использовать "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;
}
Я предлагаю быть без гражданства, удачи!
/**
* @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 для синхронизации появляется
Извините за некропостинг. Но я столкнулся с той же проблемой. Существует решение для доктрины 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;
Вы можете использовать:
default: '<?php echo date('Y-m-d H:i:s') ?>'