web-dev-qa-db-fra.com

Comment réenregistrer l'entité sous une autre ligne dans Doctrine 2

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.

68
zerkms

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();

Mise à jour

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.

Update 2

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);
149
Phil