web-dev-qa-db-fra.com

Valeurs automatiques pour updated_at, created_at dans Doctrine

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?

39
Dmitry
  1. Vous pouvez appeler $this->setCreatedAt(new \DateTime()) dans __construct méthode.
  2. Vous pouvez utiliser rappels du cycle de vie
/**
 * @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

92
oroshnivskyy

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");
    }

    ..........
}
54
BentCoder

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.

9
Sławomir Kania