Doctrine 2.1 - Значение по умолчанию для столбца datetime
Заголовок: Как задать значение по умолчанию для столбца DateTime в модели?
Описание проблемы:
Необходимо установить значение по умолчанию для столбца DateTime в модели, но я не могу сделать это следующим образом:
protected $registration_date = date("Y-m-d H:i:s", time());
Как мне правильно это реализовать?
5 ответ(ов)
Для установки значения по умолчанию 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.
Когда вы определяете свойство как тип 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
регистрационная дата будет установлена на момент создания, а для объектов из базы данных будет использовано значение, хранящееся в базе данных.
Вы можете также использовать колбэки жизненного цикла, если хотите быть более точными:
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
для активации этих колбэков.
Я думаю, что лучший способ реализовать автозаполнение для datetime
— это сделать следующим образом:
* @ORM\Column(type="datetime", options={"default"="CURRENT_TIMESTAMP"})
Встраивание логики в конструктор — не самое правильное решение, потому что установка значений по умолчанию — это ответственность SQL клиента. Если вы решите больше не использовать ORM, вы потеряете бизнес-логику. Кроме того, если использовать конструктор, вы не сможете добавить значения по умолчанию для атрибутов datetime
в существующих строках.
Есть расширение, которое автоматизирует это...
Вы можете ознакомиться с документацией по этой теме по следующей ссылке: 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")
вы можете автоматически заполнять поля с датой создания и последнего изменения объекта. Обратите внимание, что вам понадобятся соответствующие зависимости и настройки, чтобы использовать этот функционал в вашем проекте.
Функции startsWith() и endsWith() в PHP
Как получить расширение файла в PHP?
Как читать большой файл построчно?
ReCaptcha 2.0 с использованием AJAX
Почему нельзя вызывать абстрактные функции из абстрактных классов в PHP?