Следуя рекомендациям Doctrine, я понимаю, как установить значение по умолчанию для Entity, но что, если мне нужна отметка даты / времени?
Моя проблема заключается в том, что моя база данных имеет по умолчанию значение NOW () в поле, но когда я использую Doctrine для вставки записи, значения имеют значение null или пустое, но остальная часть вставки произошла.
Кроме того, поскольку Doctrine заявляет, что объявляет значение по умолчанию как const, это также создает проблему.
Предложения?
Хорошо, я нашел решение:
Опция prePersist
– это то, что я делаю.
Убедитесь, что вы определили в аннотации
<?php /** @Entity * @HasLifecycleCallbacks */ class User
и вот пример функции, которую они предлагают
/** * @PrePersist */ public function doStuffOnPrePersist() { $this->createdAt = date('Ymd H:i:s'); }
И если вы используете ORM, как я
<?php /** @ORM\Entity * @ORM\HasLifecycleCallbacks */ class User
и вот пример функции, которую они предлагают
/** * @ORM\PrePersist */ public function doStuffOnPrePersist() { $this->createdAt = date('Ymd H:i:s'); }
По моему опыту, лучше всего поместить все в свои объекты, а не пытаться заставить вашу базу данных обходить ORM.
<?php namespace Phill\PaffordBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Stack * @ORM\Table() */ class Stack { /** * @var integer * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var \DateTime * @ORM\Column(type="datetime") */ private $startDate; public function __construct() { $this->startDate = new \DateTime(); } }
Чтобы иметь точно NOW()
вы могли бы расширить Doctrine\DBAL\Types\DateTimeType
.
Другой метод:
class DateTimeNow { public function format() { return 'NOW()'; } }
Затем вы можете использовать $entity->setFieldDatetime(DateTimeNow())
вместо $entity->setFieldDatetime(new Datetime())
.
Примечание. Формат метода format()
автоматически вызывается Doctrine.
Попробуй это:
/** * @var \DateTime * * @Column(name="created", type="datetime", nullable=false) */ private $created; function __construct() { $this->created = new \DateTime(); }
Любое $value
вы назначаете created
полю, должно иметь возможность обрабатывать этот вызов:
$value->format('Ymd H:i:s');
См. Соответствующую строку кода Doctrine
Протестировано для работы с Doctrine 2.5.4
Примечание: выше работает во время создания, но не при обновлении по умолчанию – вам нужно вручную установить created
свойство в new \DateTime()
когда вы выполняете обновление или просматриваете doStuffOnPrePersist
/** @PrePersist */ public function doStuffOnPrePersist() { $this->created = date('Ymd H:i:s'); }
Для PostgreSQL вы должны просто передать значение строки now
для поля, чтобы получить функцию timestamp.