Je veux faire des champs updated_at
et created_at
dans mes entités Doctrine pour se mettre à jour automatiquement.
Dans les modèles Ruby on Rails il y a 2 champs: updated_at
et created_at
.
La description peut être trouvée ici: http://guides.rubyonrails.org/migrations.html#migration-overview :
La macro d'horodatage ajoute deux colonnes, created_at et updated_at. Ces colonnes spéciales sont automatiquement gérées par Active Record si elles existent.
Puis-je activer des fonctionnalités similaires dans Doctrine 2?
$this->setCreatedAt(new \DateTime())
dans __construct
méthode./**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function updatedTimestamps(): void
{
$this->setUpdatedAt(new \DateTime('now'));
if ($this->getCreatedAt() === null) {
$this->setCreatedAt(new \DateTime('now'));
}
}
Et n'oubliez pas d'ajouter dans la notation de classe d'entité: @ORM\HasLifecycleCallbacks
C'est une autre option si vous souhaitez les gérer séparément.
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");
}
..........
}
La solution la plus pratique pour moi est la fonction Timestampable
de StofDoctrineExtensionsBundle .
Configuration simple et plus tard, vous pouvez rendre les champs createdAt
et updatedAt
de Entity
remplis automatiquement en ajoutant deux simples annotations
comme:
@Gedmo\Mapping\Annotation\Timestampable(on="create")
et/ou
@Gedmo\Mapping\Annotation\Timestampable(on="update")
par exemple.
/**
* @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;
Sans aucun code redondant en pur PHP
.