Автоматические значения для 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?
Ответы
Ответ 1
- Вы можете вызвать
$this->setCreatedAt(new \DateTime())
в методе __construct
. - Вы можете использовать обратные вызовы жизненного цикла
/**
* @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
.