web-dev-qa-db-fra.com

Doctrine 2: comment cloner toutes les valeurs d'un objet sur un autre sauf ID?

Dans la variable $ entity, il existe un objet du même type que $ other_address, mais avec toutes les valeurs de champs renseignées.

Je souhaite définir tous les champs de l'objet $ other_address pour qu'ils aient exactement les mêmes valeurs que l'objet $ entity.

Est-ce faisable en moins de N lignes, N étant le nombre de champs à définir?

J'ai essayé le mot clé "clone", mais cela n'a pas fonctionné.

Voici le code.

                $other_address = $em->getRepository('PennyHomeBundle:Address')
          ->findBy(array('user' => $this->get('security.context')->getToken()->getUser()->getId(), 'type' => $check_type));
                $other_address = $other_address[0];


                //I want to set all values in this object to have values from another object of same type
                $other_address->setName($entity->getName());
                $other_address->setAddress1($entity->getAddress1());
                $other_address->setAddress2($entity->getAddress2());
                $other_address->setSuburbTown($entity->getSuburbTown());
                $other_address->setCityState($entity->getCityState());
                $other_address->setPostZipCode($entity->getPostZipCode());
                $other_address->setPhone($entity->getPhone());
                $other_address->setType($check_type);
25
Tool

Je ne sais pas pourquoi le clonage ne fonctionne pas.

Cela semble fonctionner pour moi, au moins dans un cas de test de base:

$A = $em->find('Some\Entity',1);

$B = clone $A;
$B->setId(null);

Si vous devez vous inquiéter au sujet de vos relations, vous voudrez peut-être implémenter __clone en toute sécurité afin qu’il fasse ce que vous voulez avec des entités apparentées.

38
timdev

Il suffit de cloner l'entité, vous n'avez même pas besoin de désidentifier l'identifiant. La doctrine a abordé cela pour vous

24
David Lin
$A = $em->find('Some\Entity',1);

$B = clone $A;
$em->persist($B);
$em->flush();

si vous merge il mettra à jour l'entité, mieux vous utilisez persist() il dupliquera la ligne entière et ajoutera une clé primaire auto incrémentée

1
Waqar Haider