【问题标题】:Symfony 3 - Save as copySymfony 3 - 另存为副本
【发布时间】: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 是一个好且更容易的主意,将其所有值设置为原始值,然后持久化并刷新。

标签: php entity symfony


【解决方案1】:

您的实体中的Codigo 列具有唯一约束。 可能是你没有改变好属性

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

【讨论】:

  • @Alvin 我不认为这是问题所在,Nombre 和 Codigo 值都没有设置值。显然它尝试插入副本,然后尝试更新原始清单。在我的日志中,我有一个开始事务,两个插入,然后一个回滚。我想问题出在第二次插入中。
  • 它记得我我的old question,你可以试试$em->merge($copy) ?
  • 更改合并后不再出现错误,但新副本仅生成主要实体清单,未填充组、任务和纠正措施。也许问题是嵌套实体没有链接到副本?然后级联坚持试图从反面生成清单?但我怎么能防止呢?
  • 已编辑问题以添加更改,我可以处理新的嵌套实体,现在问题出现在已删除的实体上。
【解决方案2】:

如果你看你的错误信息,@goto 是对的,这行有问题:

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

因为在错误信息中:

执行时发生异常 '插入清单 (Nombre, RotuloB, RotuloR, RotuloM, RotuloNA, RotuloValidador, Codigo, Estado, userCreator, userModifier) 值(?,?,?,?,?,?,?,?,?,?)' 带参数 [“123”、“1”、“2”、“3”、“4”、1、“123”、1、1、1]:

值“123”是重复的。所以这就是问题所在。为什么它得到数据库中已经存在的“123”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2022-10-12
    • 2017-09-01
    相关资源
    最近更新 更多