【发布时间】:2016-06-29 12:46:32
【问题描述】:
我正在尝试将实体保存为副本。同一个表单将有两个提交按钮,一个用于保存和覆盖,另一个用于保存副本。
保存和覆盖工作正常,保存为副本不能说相同,到目前为止我在我的方法中发现了不同的问题。
这是我控制器中的操作:
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 试图在后台删除它,我得到一个错误...“无法删除分离的实体”。
【问题讨论】:
-
您可以添加您的实体注释 Nombre 和 codigo 吗?
-
也许实例化新的 Checklist 是一个好且更容易的主意,将其所有值设置为原始值,然后持久化并刷新。