Может ли кто-нибудь сказать мне, как добавить значение по умолчанию в столбце datetime? Я не могу так:
protected $registration_date = date("Ymd H:i:s", time());
Так как?
Вы сопоставляете свою собственность с типом DateTime, а затем устанавливаете значение в конструкторе, используя новый экземпляр DateTime:
/** * @Entity * @Table(name="...") */ class MyEntity { /** @Column(type="datetime") */ protected $registration_date; public function __construct() { $this->registration_date = new DateTime(); } }
Это работает как конструктор сохраняемого класса, не призванный к гидратации.
Вы также можете использовать обратные вызовы жизненного цикла, если хотите быть очень точными:
/** * @HasLifecycleCallbacks * ... */ class MyEntity { /** * @PrePersist */ public function onPrePersistSetRegistrationDate() { $this->registration_date = new \DateTime(); } }
Для значения по умолчанию CURRENT_TIMESTAMP:
@ORM\Column(name="created_at", type="datetime", options={"default": 0})
Работал для меня …
Существует расширение для этого автоматизации этого …
https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/timestampable.md
/** * @var \DateTime * * @ORM\Column(name="date_added", type="datetime") * @Gedmo\Timestampable(on="create") */ private $date_added; /** * @var \DateTime * * @ORM\Column(name="date_modified", type="datetime") * @Gedmo\Timestampable(on="update") */ private $date_modified;
Я думаю, лучший способ выполнить автозаполнение для datetime
– это сделать так:
* @ORM\Column(type="datetime", options={"default"="CURRENT_TIMESTAMP"})
Включение логики в конструктор является неправильным решением, потому что установка значений по умолчанию – это ответственность клиента SQL . Если вы решите больше не использовать ORM, вы потеряете бизнес-логику. Кроме того, при использовании конструктора вы не сможете добавлять метки времени по умолчанию для атрибутов datetime
для существующих строк .