2016-06-29 2 views
0

Я пытаюсь сохранить объект как копию. В той же форме будут две кнопки отправки, одна для сохранения и перезаписывания, а другая - для сохранения в виде копии.Symfony 3 - Сохранить как копию

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

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

public function EditAction($id, Request $request) 
{ 

    $em = $this->getDoctrine()->getManager(); 
    $checklist = $em->getRepository('AppBundle:Checklist')->find($id); 


    if (!$checklist) { 
     throw $this->createNotFoundException('No se ha encontrado el checklist de id ' . $id); 
    } 

    $editForm = $this->createForm(ChecklistType::class, $checklist); 

    $editForm->handleRequest($request); 

    if ($editForm->isValid()) { 
     $checklist->setUserModificator($user); 
     $checklist->setEstado(true); 

     if ($editForm->get('Save')->isClicked()) { 
      $em->persist($checklist); 
      $em->flush(); 
     } 

     if ($editForm->get('SaveCopy')->isClicked()) { 
      $copy = clone $checklist; 
      $copy->setNombre($checklist->getNombre() . ' #COPY' . substr(uniqid(), 8, 4) . '#'); 

      $em->persist($copy); 
      $em->detach($checklist); 
      $em->flush(); 
     } 
     $this->get('session')->getFlashBag()->add('success', "Se ha actualizado el Checklist correctamente."); 

     return $this->redirectToRoute('listChecklist', array('id' => $id)); 
    } 

    return $this->render(':checklist:create.html.twig', array(
     'edit' => true, 
     'form' => $editForm->createView(), 
    )); 
} 

Форма ручки сущности Контрольный список, каждый контрольный список будет иметь коллекцию ChecklistGroups, каждая группа будет иметь коллекцию ChecklistGroupTasks и каждая задача будет иметь коллекцию контрольного спискаGroupTaskCorrective. Эти 4 объекта обрабатываются в форме.

Мой подход работает, если никаких изменений в форме при нажатии кнопки «Сохранить как копию». Мой подход также работает, если единственная модификация заключается в создании новых групп.

Проблемы возникают, когда я создаю как группу, так и новые задачи, вложенные в эту группу.

An exception occurred while executing 'INSERT INTO checklist (Nombre, RotuloB, RotuloR, RotuloM, RotuloNA, RotuloValidador, Codigo, Estado, userCreator, userModifier) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["123", "1", "2", "3", "4", 1, "123", 1, 1, 1]: 

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '123' for key 'UNIQ_5C696D2F3D3C9410' 

Я думаю, Symfony пытается создать копию и в то же время пытается сохранить исходный контрольный список, даже если он явно отсоединена.

Это из моих журналов, как-то он пытается выполнить две вставки запросов:

DEBUG - "START TRANSACTION" 
DEBUG - INSERT INTO checklist (Nombre, RotuloB, RotuloR, RotuloM, RotuloNA, RotuloValidador, Codigo, Estado, userCreator, userModifier) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
DEBUG - INSERT INTO checklist (Nombre, RotuloB, RotuloR, RotuloM, RotuloNA, RotuloValidador, Codigo, Estado, userCreator, userModifier) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
DEBUG - "ROLLBACK" 

Благодарности

EDIT:

Хорошо, теперь это сохранить новые вложенные объекты я создаю:

/** @var ChecklistGroup $newGroup */ 
      foreach ($copy->getGroups() as $newGroup) { 
       $newGroup->setChecklist($copy); 
       /** @var ChecklistTask $newTask */ 
       foreach($newGroup->getTasks() as $newTask) 
       { 
        $newTask->setChecklistgroup($newGroup); 
        /** @var ChecklistTaskCorrective $newCorrective */ 
        foreach($newTask->getCorrectives() as $newCorrective) 
        { 
         $newCorrective->setChecklistTask($newTask); 
        } 
       } 
      } 

Но теперь я не знаю, как справиться с удалением, например, когда удаление группы. Я попытался отсоединить группу, но symfony пытается удалить ее в фоновом режиме, и я получаю сообщение об ошибке ... «Невозможно удалить отдельный объект».

+0

Можете ли вы добавить свою сущность к нотации и кодого? – goto

+0

Возможно, это хорошая и простая идея создать новый контрольный список, установить все его значения из оригинала, а затем, сохранить и сбросить. – Muriano

ответ

1

Ваша колонка Codigo в вашей сущности имеет уникальный контраст. Это может быть, вы не изменяете хороший атрибут

$copy->setCodigo($checklist->getCodigo() . ' #COPY' . substr(uniqid(), 8, 4) . '#'); 
+0

@ Алвин Я не думаю, что это проблема, ни значения Nombre, ни Codigo не имеют заданных значений. По-видимому, он пытается вставить копию, а затем пытается обновить исходный контрольный список. В моих журналах у меня начальная транзакция, две вставки, а затем откат. Я думаю, проблема во второй вставке. – Kynethix

+0

помни меня мой [старый вопрос] (http://stackoverflow.com/questions/20118421/update-an-entity-with-unique-key-insert-instead-of-update), можете ли вы попробовать с '$ em -> merge ($ copy)? ' – goto

+0

Больше никаких ошибок после изменения сохраняются при слиянии, но новая копия генерирует только основной объект. Контрольный список, группы, задачи и корректировки не заполняются. Может быть, проблема в том, что вложенные объекты не связаны с копией? А затем каскад persist пытается создать контрольный список с обратной стороны? Но как я мог это предотвратить? – Kynethix

0

Если вы посмотрите на сообщение об ошибке, @goto прав, есть проблема с этой линии:

$copy->setNombre($checklist->getNombre() . ' #COPY' . substr(uniqid(), 8, 4) . '#'); 

Поскольку в сообщении об ошибке :

исключения при выполнении «INSERT INTO контрольного списка (Номбры, RotuloB, RotuloR, RotuloM, RotuloNA, RotuloValidador, Codigo, Эстады, userCreator, userModifier) ​​ VALUES (?,?,?,?,?,?) ' с параметрами ["123", "1", "2", "3", "4", 1 , «123», 1, 1, 1]:

Значение «123» является дубликатом. Вот в чем проблема. Почему он получает «123», который уже существует в базе данных.

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