Подтвердить что ты не робот

Автоматические значения для updated_at, created_at в Доктрине

Я хочу, чтобы поля updated_at и created_at в моих объектах Doctrine обновлялись автоматически.

В моделях Ruby on Rails есть 2 поля: updated_at и created_at.

Описание можно найти здесь: http://guides.rubyonrails.org/migrations.html#migration-overview:

Макрометр timestamps добавляет два столбца, created_at и updated_at. Эти специальные столбцы автоматически управляются активной записью, если они существуют.

Можно ли включить аналогичные функции в Doctrine 2?

4b9b3361

Ответ 1

  1. Вы можете вызвать $this->setCreatedAt(new \DateTime()) в методе __construct.
  2. Вы можете использовать обратные вызовы жизненного цикла
/**
 * @ORM\PrePersist
 * @ORM\PreUpdate
*/
public function updatedTimestamps(): void
{
    $this->setUpdatedAt(new \DateTime('now'));    
    if ($this->getCreatedAt() === null) {
        $this->setCreatedAt(new \DateTime('now'));
    }
}

И не забудьте добавить в нотацию класса сущности: @ORM\HasLifecycleCallbacks

Ответ 2

Это еще один вариант, если вы захотите обработать их отдельно.

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="person")
 * @ORM\HasLifecycleCallbacks
 */
class Person
{
    ..........

    /**
     * @var datetime $created
     *
     * @ORM\Column(type="datetime")
     */
    protected $created;

    /**
     * @var datetime $updated
     * 
     * @ORM\Column(type="datetime", nullable = true)
     */
    protected $updated;


    /**
     * Gets triggered only on insert

     * @ORM\PrePersist
     */
    public function onPrePersist()
    {
        $this->created = new \DateTime("now");
    }

    /**
     * Gets triggered every time on update

     * @ORM\PreUpdate
     */
    public function onPreUpdate()
    {
        $this->updated = new \DateTime("now");
    }

    ..........
}

Ответ 3

Самым удобным решением для меня является функция Timestampable StofDoctrineExtensionsBundle.

Простая конфигурация и позже вы можете сделать поля, createdAt и updatedAt of Entity заполненными автоматически, добавив две простые annotations такие как:

@Gedmo\Mapping\Annotation\Timestampable(on="create")

и/или

@Gedmo\Mapping\Annotation\Timestampable(on="update")

например

/**
 * @var \DateTime
 * @Gedmo\Mapping\Annotation\Timestampable(on="create")
 * @Doctrine\ORM\Mapping\Column(type="datetime")
 */
protected $createdAt;

/**
 * @var \DateTime
 * @Gedmo\Mapping\Annotation\Timestampable(on="update")
 * @Doctrine\ORM\Mapping\Column(type="datetime")
 */
protected $updatedAt;

Без какого-либо избыточного кода на чистом PHP.