Doctrine - добавьте отметку времени по умолчанию для сущности типа NOW()

Следуя рекомендациям Doctrine, я понимаю, как установить значение по умолчанию для Entity, но что, если бы мне нужна отметка даты/времени?

Моя проблема заключается в том, что моя база данных имеет по умолчанию значение NOW() в поле, но когда я использую Doctrine для вставки записи, значения имеют значение null или пустое, но остальная часть вставки произошла.

Также, поскольку Doctrine заявляет, что объявляет значение по умолчанию как const, это также создает проблему.

Предложения?

Ответы

Ответ 1

Хорошо, я нашел решение:

Опция prePersist - это то, что я делаю.

Убедитесь, что вы определили в аннотации

<?php

/** @Entity 
 *  @HasLifecycleCallbacks 
 */
class User

и вот пример функции, которую они предлагают

/** 
 *  @PrePersist 
 */
public function doStuffOnPrePersist()
{
    $this->createdAt = date('Y-m-d H:i:s');
}

И если вы используете ORM, как я,

<?php

/** @ORM\Entity 
 *  @ORM\HasLifecycleCallbacks 
 */
class User

и вот пример функции, которую они предлагают

/** 
 *  @ORM\PrePersist 
 */
public function doStuffOnPrePersist()
{
    $this->createdAt = date('Y-m-d H:i:s');
}

Ответ 2

По моему опыту лучше всего поместить все в свои объекты и не пытаться заставить вашу базу данных обходить 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();
  }

}

Ответ 3

Чтобы иметь ровно NOW(), вы можете расширить Doctrine\DBAL\Types\DateTimeType.

Другой метод:

class DateTimeNow
{
    public function format() 
    {
        return 'NOW()';
    }
}

Затем вы можете использовать $entity->setFieldDatetime(DateTimeNow()) вместо $entity->setFieldDatetime(new Datetime()).
Примечание. Метод format() автоматически вызывается Doctrine.

Ответ 4

Попробуйте следующее:

/**
 * @var \DateTime
 *
 * @Column(name="created", type="datetime", nullable=false)
 */
private $created;

function __construct()
{
    $this->created = new \DateTime();
}

Любой $value, который вы назначаете в поле created, должен иметь возможность обрабатывать этот вызов:

$value->format('Y-m-d H:i:s');

Смотрите соответствующую строку кода Doctrine

Протестировано для работы с Doctrine 2.5.4

Примечание: выше работает во время создания, но не при обновлении по умолчанию - вам нужно вручную установить свойство created на new \DateTime() при обновлении или просмотре doStuffOnPrePersist

/** @PrePersist */
public function doStuffOnPrePersist()
{
    $this->created = date('Y-m-d H:i:s');
}

Ответ 5

Для PostgreSQL вы должны просто передать строковое значение now для поля, чтобы функция timestamp функционировала.

Ответ 6

Вы можете использовать TimestampableEntity Trait для автоматического создания полей созданного и обновленного в вашей сущности;

Сначала установите доктрины-расширения;

composer require gedmo/doctrine-extensions

Во-вторых, добавьте черту в свой класс сущностей;

use Gedmo\Timestampable\Traits\TimestampableEntity;

    /**
     * @ORM\Entity(repositoryClass="App\Repository\ProjectRepository")
     */
    class Project
    {
        use TimestampableEntity;