2010-09-20 7 views
6

J'ai un tas d'entités avec à la fois un champ date_created et un champ date_modified, et j'essaye de faire en sorte que ces champs se définissent automatiquement sur insert ou update. date_created est uniquement défini sur insert, mais date_modified est défini sur insert ou update.Doctrine 2 événement preUpdate - non déclenché lors de l'insertion?

J'ai une méthode dans ma classe d'entité avec une annotation @PreUpdate, mais elle ne semble être appelée que lorsqu'une entité est mise à jour. Il n'est pas appelé lorsqu'une nouvelle entité est insérée. La documentation le dit à propos de l'événement preUpdate:

"L'événement preUpdate se produit avant les opérations de mise à jour de la base de données vers les données d'entité."

Est-ce correct? Si oui, quelle est la meilleure façon d'appeler une méthode avant la mise à jour ou l'insertion? À l'heure actuelle si je baliser la méthode à la fois @PreUpdate et @PrePersist il fonctionne, mais je ne suis pas sûr si cela est optimal:

/** 
* @PreUpdate 
* @PrePersist 
*/ 
public function beforeSave() 
{ 
    if (!$this->getCreatedAt()) { 
     $this->setCreatedAt(new \DateTime()); 
    } 
    $this->setModifiedAt(new \DateTime()); 
} 

Répondre

9

persisteront et mise à jour sont 2 événements différents, donc si vous voulez que le rappel à être appliqué pour les deux, vous aurez besoin des deux annotations. Il peut répondre à vos doutes à créer au lieu de deux méthodes:

/** 
* @PrePersist 
*/ 
public function beforePersist() 
{ 
    $this->setCreatedAt(new \DateTime());   
    $this->setModifiedAt(new \DateTime()); 
} 

/** 
* @PreUpdate 
*/ 
public function beforeUpdate() 
{   
    $this->setModifiedAt(new \DateTime()); 
} 
+0

Merci - je considérais la création de 2 méthodes et de le faire de cette façon, mais je peux vivre avec. Je n'étais tout simplement pas sûr si preUpdate était légalement uniquement pour les mises à jour, ou les insertions et les mises à jour. –

Questions connexes