@sergmit

Doctrine, как задать значение даты по умолчанию?

Есть модель в которой указано поле:
/**
     * @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"})
     */
    private $created_at;

после создания миграции в таблице появляется значение по умолчанию(current_timestamp() ), если вставлять напрямую в базу данных , значение вставляется,
если вставлять через entity, выдает ошибку - поле не может быть null, по идее этого поля вообще не должно быть в запросе(оно там присутствует)
  • Вопрос задан
  • 2429 просмотров
Решения вопроса 1
@Flying
Просто проинициализируйте это поле в конструкторе или в обработчике @PrePersist lifecycle event.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@dimuska139
Backend developer
Тебе надо создать кастомный тип как-то вот так:
<?php
namespace MyProject\Types;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;


class DefaultNow extends Type
{
    const DEFAULTNOW = 'defaultnow'; // modify to match your type name

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        // return the SQL used to create your column type. To create a portable column type, use the $platform.
    }

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        $dt = new \DateTime($value);
        $dt->setTimezone(new \DateTimeZone('UTC'));
        return $dt->format('Y-m-d H:i:s');
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        if ($value == null)
            return 'now()';
        return $value;
        // This is executed when the value is written to the database. Make your conversions here, optionally using the $platform.
    }

    public function getName()
    {
        return self::DEFAULTNOW; // modify to match your constant name
    }
}


Затем тебе этот тип надо подключить к Доктрине:

if (!Type::hasType(DefaultNow::DEFAULTNOW)) {
     Type::addType(DefaultNow::DEFAULTNOW, DefaultNow::class);
}


Ну и в аннотациях столбца в entity указать:
/**
     * @var \DateTime|null
     *
     * @ORM\Column(name="created_at", type="defaultnow")
     */
    private $createdAt;
Ответ написан
Комментировать
@DeadAndFat
Для полей createdAt, updateAt в доктрине есть trait: Timestampable
Соответственно, в аннотации класа нужно добавить @ORM\HasLifecycleCallbacks
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы