Doctrine 2: как клонировать все значения из одного объекта на другой, кроме ID?
В переменной $entity существует объект того же типа, что и $other_address, но со всеми заполненными значениями полей.
Я хочу, чтобы все поля в объекте $other_address имели точные значения, такие как объект $entity.
Является ли это выполнимым в менее чем N числе строк, где N - количество полей, которые мне нужно установить?
Я пробовал ключевое слово "клонировать", но он не работал.
Здесь код.
$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);
Ответы
Ответ 1
Я не уверен, почему клонирование не будет работать.
Это, похоже, работает для меня, по крайней мере, в основном тестовом случае:
$A = $em->find('Some\Entity',1);
$B = clone $A;
$B->setId(null);
Если у вас есть отношения, о которых можно беспокоиться, вы можете безопасно реализовать __clone, чтобы он делал то, что вы хотите, чтобы он сущности.
Ответ 2
Просто клонируйте объект, вам даже не нужно отключать идентификатор. Доктрина решила это для вас.
Ответ 3
$A = $em->find('Some\Entity',1);
$B = clone $A;
$em->persist($B);
$em->flush();
если вы merge
обновите объект, лучше всего используйте persist()
, он будет дублировать всю строку и добавить автоматически увеличиваемый первичный ключ