Доктрина 2: как клонировать все значения из одного объекта в другой, кроме ID? - PullRequest
25 голосов
/ 23 сентября 2011

В переменной $ entity есть объект того же типа, что и $ other_address, но со всеми заполненными значениями полей.

Я хочу, чтобы все поля в объекте $ other_address имели точно такие же значения, как $объект сущности.

Это выполнимо менее чем за N строк, где N - количество полей, которые мне нужно установить?

Я пробовал ключевое слово "clone", но оно не сработало.

Вот код.

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

Ответы [ 3 ]

38 голосов
/ 24 сентября 2011

Я не уверен, почему клонирование не будет работать.

Мне кажется, это работает, по крайней мере, в базовом тестовом случае:

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

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

Если у вас есть отношения, о которых нужно беспокоиться, вы можете безопасно внедрить __clone , чтобы он делал то, что вы хотите, чтобы он делал со связанными объектами.

24 голосов
/ 15 мая 2013

Просто клонируйте сущность, вам даже не нужно сбрасывать идентификатор. Доктрина взялась за это для вас

1 голос
/ 01 августа 2016
$A = $em->find('Some\Entity',1);

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

если вы merge обновите объект, лучше всего использовать persist(), он продублирует всю строку и добавит первичный ключ с автоинкрементом

...