0

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

25

Заголовок: Как задать значение по умолчанию для столбца DateTime в модели?

Описание проблемы:

Необходимо установить значение по умолчанию для столбца DateTime в модели, но я не могу сделать это следующим образом:

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

Как мне правильно это реализовать?

5 ответ(ов)

1

Для установки значения по умолчанию CURRENT_TIMESTAMP в Doctrine, вы можете использовать следующий синтаксис:

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

Если вы работаете со старыми версиями Symfony, можно использовать:

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

Это сработало для меня... Однако стоит отметить, что это работает только с MySQL.

0

Когда вы определяете свойство как тип DateTime и устанавливаете его значение в конструкторе, это работает, потому что конструктор класса, который уже был сохранен (persisted), не вызывается при гидратации (hydration) сущности.

В вашем примере:

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

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

Если вы создаете новый экземпляр MyEntity, то при вызове конструктора будет установлен текущий момент времени в $registration_date. Однако, если сущность MyEntity уже была сохранена в базе данных и затем загружена обратно (гидратирована), конструктор не будет вызван. Это значит, что свойство $registration_date будет заполнено значением из базы данных, а не значением, установленным в конструкторе.

Таким образом, для новых объектов MyEntity регистрационная дата будет установлена на момент создания, а для объектов из базы данных будет использовано значение, хранящееся в базе данных.

0

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

use Doctrine\ORM\Mapping as ORM;

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

В этом примере мы определяем метод onPrePersistSetRegistrationDate, который будет вызываться перед тем, как объект MyEntity будет сохранен в базе данных. Это позволяет автоматически устанавливать значение registration_date в текущее время, что может быть полезно для логирования или учёта времени создания записи. Не забудьте добавить аннотацию @ORM\HasLifecycleCallbacks для активации этих колбэков.

0

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

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

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

0

Есть расширение, которое автоматизирует это...

Вы можете ознакомиться с документацией по этой теме по следующей ссылке: Doctrine Extensions - Timestampable.

Пример использования:

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

С помощью аннотаций @Gedmo\Timestampable(on="create") и @Gedmo\Timestampable(on="update") вы можете автоматически заполнять поля с датой создания и последнего изменения объекта. Обратите внимание, что вам понадобятся соответствующие зависимости и настройки, чтобы использовать этот функционал в вашем проекте.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь