我正在尝试将实体另存为副本。同一个表单将有两个提交按钮,一个用于保存和覆盖,另一个用于保存为副本。
保存并覆盖正常工作,不能说保存为副本相同,到目前为止,我发现我的方法存在不同的问题。
这是我控制器中的操作:
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试图在后台删除它,我得到一个错误...“无法删除分离的实体”。
答案 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”。