2013-10-25 3 views
1

Мне нравится клонировать сущность в Symfony2. Он работает нормально, если я клонирую Entity, где этот объект является дочерним. Следующий код не работает. Это клонирует объект, но я получаю дубликат ключа ошибкиSymfony2 Клонирование объектов не работает

код в мой контроллер:

$id = $request->get('id'); 
$entity = $orSessionVersionRepository->find($id); 
// A new Version must be created! 
// Clone OrSessionVersion entity 
$cloneEntity = clone $entity; 
$em->persist($cloneEntity); 
$em->flush(); 

Ошибка:

An exception occurred while executing 'INSERT INTO or_session_version (version, name, duration, occupancy_standard, condition_weekday, condition_start, condition_end, creator, remarks, edit_reason, min_age, max_age, status, type, color, created, modified, or_session_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params [2, "Session 1", "04:00:00", "75", "a:7:{i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;}", "08:00:00", "16:30:00", "admin", null, null, 16, 100, "final", "default", "#1429e6", "2013-10-25 14:25:14", "2013-10-25 14:25:14", "41"]: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2-41' for key 'or_session_id_version' 

Кто-то может помочь?

+0

Почему вам нужно клонировать объект? –

+0

«$ em-> persist ($ entity);» работать? – goto

+1

Вам нужно отменить идентификатор или другое уникальное свойство, иначе вы столкнетесь с нарушением ограничения. – busypeoples

ответ

0

Вы должны также клонировать дочернюю сущность.

Попробуйте добавить этот метод на вашей материнской компании:

public function __clone() { 
    if ($this->id) { 
     $this->child = clone $this->child; 
    } 
} 
0

Скорее всего клонированное лицо должно быть отделено от ОРМ.

Вы можете попробовать сделать

$id = $request->get('id'); 
$entity = $orSessionVersionRepository->find($id); 

$cloneEntity = clone $entity; 

$em->detach($cloneEntity); 
$cloneEntity->setId(null); 

$em->persist($cloneEntity); 
$em->flush(); 
+0

Это решение не работает. Я клонировал сущности более чем в 1 действие, и там он работает нормально. Я реализовал публичную функцию __clone в каждом объекте, к которому клонируются отношения. Возможно ли, что функция clone не работает, потому что доктрина дает объект Proxy вместо реального объекта? –

Смежные вопросы