Doctrine 2.1 - значение по умолчанию столбца datetime

Может ли кто-нибудь сказать мне, как добавить значение по умолчанию в столбец datetime? Я не могу сделать это вот так:

protected $registration_date = date("Y-m-d H:i:s", time());

Итак, как?

Ответ 1

Вы сопоставляете свое свойство как тип DateTime, затем устанавливаете значение в конструкторе с помощью нового экземпляра DateTime:

/**
 * @Entity
 * @Table(name="...")
 */
class MyEntity
{
    /** @Column(type="datetime") */
    protected $registration_date;

    public function __construct()
    {
        $this->registration_date = new DateTime(); 
    }
}

Это работает как конструктор сохраняемого класса, не вызываемый гидратацией.

Ответ 2

Вы также можете использовать обратные вызовы жизненного цикла, если хотите быть очень точными:

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\HasLifecycleCallbacks
 * ...
 */
class MyEntity
{
    /**
     * @ORM\PrePersist
     */
    public function onPrePersistSetRegistrationDate()
    {
        $this->registration_date = new \DateTime();
    }
}

Ответ 3

Для значения по умолчанию CURRENT_TIMESTAMP:

     @ORM\Column(name="created_at", type="datetime", options={"default": "CURRENT_TIMESTAMP"})

Или для более старых версий Symfony:

     @ORM\Column(name="created_at", type="datetime", options={"default": 0})

Работал для меня... Однако это работает только с MySQL.

Ответ 4

Существует расширение для этого автоматизации этого...

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;

Ответ 5

Я думаю, лучший способ выполнить автозаполнение для datetime заключается в следующем:

* @ORM\Column(type="datetime", options={"default"="CURRENT_TIMESTAMP"})

Включение логики в конструктор - это неправильное решение, поскольку установка значений по умолчанию ответственность клиента SQL. Если вы решите больше не использовать ORM, вы потеряете бизнес-логику. Кроме того, при использовании конструктора вы не сможете добавлять метки времени по умолчанию к атрибутам datetime для существующих строк.

Ответ 6

@var string @ORM\Column(name="login_at", type="datetime", options={"default" = "CURRENT_TIMESTAMP"})

Это сработает. Просто опубликуйте для будущих ссылок.

Ответ 7

Работа для меня с MySql и Symfony 3.4.

...
fields:
    start_date:
        type: date
        nullable: false
        options:
            default: '1910-01-01'
            comment: 'The default date is 1910-01-01'
...