Disons que j'ai une entité $e
. Existe-t-il un moyen générique de le stocker sous une autre ligne, qui aurait les mêmes données d'entité mais une autre clé primaire?
Pourquoi j'en ai besoin: j'implémente une sorte de schéma Base de données temporelle et au lieu de mettre à jour la ligne, je dois juste en créer une autre.
Essayez le clonage et ajoutez la méthode suivante à votre entité
public function __clone() {
$this->id = null;
}
Vous devrez peut-être détacher l'entité avant de la persister. Je n'ai pas ma machine de développement à portée de main pour le tester en ce moment.
$f = clone $e;
$em->detach($f);
$em->persist($f);
$em->flush();
Je viens d'essayer d'utiliser une simple démo SQLite. Vous ne devriez rien faire. Ce qui suit a fonctionné pour moi sans ajouter de méthode __clone()
ni faire autre chose hors de l'ordinaire
$new = clone $old;
$em->persist($new);
$em->flush();
Une fois vidée, l'entité $new
Avait un nouvel ID et a été enregistrée en tant que nouvelle ligne dans la base de données.
Je voudrais toujours annuler la propriété ID via la méthode __clone()
car cela a du sens à partir d'une vue de modèle pure.
Creuser dans le code Doctrine, c'est parce que les classes proxy générées implémentent __clone()
avec cette ligne importante
unset($this->_entityPersister, $this->_identifier);