Symfony 3 - 另存为副本

时间:2016-06-29 12:46:32

标签: php entity symfony

我正在尝试将实体另存为副本。同一个表单将有两个提交按钮,一个用于保存和覆盖,另一个用于保存为副本。

保存并覆盖正常工作,不能说保存为副本相同,到目前为止,我发现我的方法存在不同的问题。

这是我控制器中的操作:

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(),
    ));
}

表单处理实体Checklist,每个Checklist都有一个ChecklistGroups集合,每个组都有一个ChecklistGroupTasks集合,每个任务都有一个ChecklistGroupTaskCorrective集合。这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" 

由于

编辑:

好的,现在它正在保存我创建的新嵌套实体:

/** @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试图在后台删除它,我得到一个错误...“无法删除分离的实体”。

2 个答案:

答案 0 :(得分:1)

您实体中的专栏Codigo具有独特的约束力。 可能是你没有改变好的属性

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

答案 1 :(得分:0)

如果您查看错误消息,@ goto是正确的,此行存在问题:

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

因为在错误消息中:

执行时发生异常 '插入检查清单 (Nombre,RotuloB,RotuloR,RotuloM,RotuloNA,RotuloValidador,Codigo,Estado,userCreator,userModifier) 价值观(?,?,?,?,?,?,?,?,?,?)' 与params [“123”,“1”,“2”,“3”,“4”,1,“123”,1,1,1]:

值“123”是副本。这就是问题所在。为什么数据库中已存在“123”。