当前位置: 首页 > 知识库问答 >
问题:

使用嵌入的表单集合保存相关条令实体时出现Symfony SQL错误

穆锋
2023-03-14

我一直在关注Symfony网站上的如何嵌入表单集合示例。

我的情况有点不同。我有两个条令实体,一个是实验,一个是目标,一个是复合主键关系(见下面的代码)。

基本上,一个实验可以有多个目标,但目标ID只有与实验ID和用户ID结合时才是唯一的。

class Goal
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", options={"default": 1})
     * @ORM\Id
     */
    protected $id = 1;

    /**
     * @var integer
     *
     * @ORM\Column(name="experiment_id", type="integer", nullable=true, options={"default": null})
     * @ORM\Id
     */
    protected $experimentId;

    /**
     * @ORM\ManyToOne(targetEntity="Experiment", inversedBy="goals")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="experiment_id", referencedColumnName="id"),
     *   @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
     * })
     */
    protected $experiment;

    /**
     * @var integer
     *
     * @ORM\Column(name="user_id", type="integer", nullable=true, options={"default": null})
     * @ORM\Id
     */
    protected $userId;

    /**
     * @ORM\ManyToOne(targetEntity="Optimcore\UserBundle\Entity\User", inversedBy="goals", cascade={"persist"})
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

    // ...
}

我有一个ExperimentType表单,它嵌入了一个GoalType表单的集合。

在我的控制器中,我有以下代码:

$originalGoals = new ArrayCollection();
foreach ($experiment->getGoals() as $goal) {
    $originalGoals->add($goal);
}

$form = $this->createForm(new ExperimentType(), $experiment, array(
    'action' => $this->generateUrl('experiment_goals', array('id' => $experiment->getId())),
    'method' => 'PUT',
));
$form->handleRequest($request);

if ($form->isValid()) {
    $em = $this->getDoctrine()->getManager();

    // remove the relationship between the Goal and the Experiment
    foreach ($originalGoals as $goal) {
        if (false === $experiment->getGoals()->contains($goal)) {
            $goal->setExperiment(null);
            $em->persist($goal);
            $em->remove($goal);
        }
    }

    foreach ($experiment->getGoals() as $goal) {
        if (is_null($goal->getUserId())) {
            $this->getUser()->addGoal($goal);
            $goal->setUserId($this->getUser()->getId());
            $goal->setUser($this->getUser());
            $em->persist($goal);
        }
    }

    $em->flush();

}

我有javascript可以在页面上添加和删除目标表单。新目标分配给下一个可用ID,因此,如果页面上的最后一个目标的ID为2,则下一个目标的ID为3。

添加新目标和保存到数据库可以正常工作,删除目标和保存也可以正常工作。

然而,当一个目标被页面上的javascript删除,然后一个新目标被javascript添加时,该目标将被分配与被删除的目标相同的ID。现在,当表单提交并且条令尝试保存目标时,会抛出一个SQL错误,因为条令尝试插入一个与Javascript删除的目标ID相同但仍在数据库中的目标。

我如何让条令在插入新目标之前删除第一个目标?我之前试过冲,但这没用。我如何强制条令只删除旧目标,然后再添加保存新目标?还是我完全错了?

以下是错误消息:

An exception occurred while executing 'INSERT INTO goal (id, experiment_id, user_id, name) VALUES (?, ?, ?, ?)' with params ["2", 183, 6, "Goal 2"]:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2-183-6' for key 'PRIMARY'

共有1个答案

毕嘉
2023-03-14

在条令文件中找到了一个很长问题的简单答案。

10.2。条令如何检测变化

  • 仅使用$entityManager刷新单个实体-

要让Doctrine在保存新目标之前删除原始目标,我必须添加$em-

foreach ($originalGoals as $goal) {
    if (false === $experiment->getGoals()->contains($goal)) {
        $goal->setExperiment(null);
        $em->persist($goal);
        $em->remove($goal);

        // commit this change to the database
        $em->flush($goal);
    }
}

 类似资料:
  • 我有一个数据结构,其中一个主题有许多问题(一对多),一个问题有许多答案(一对多)。 我已经在主题表单中设置了问题作为嵌入式集合,由于有了烹饪书条目,我可以百分之百地解决所有问题。 当我试图开发它以在问题表单中嵌入一组答案表单时,我遇到了一个问题。 包含顶层原型表单的数据原型属性具有表单的全部深度,因此包括问题和答案的原型。但它对每个级别使用相同的占位符。 你可以在底部看到一条很长的线,我想这就是原

  • 我在Symfony2.8上遇到了一个多实体关系的问题。我有实体旅行,它可以由许多经验实体组成。 以下是我的旅行定义: 另一方面,我有经验实体: 在控制器中,用户可以生成一个新的行程,将对象置于会话中以调用它,直到真正的关联。 问题。在第一次通话时,它就像一个魔咒,添加experience\u trip条目,一切正常。在第二次调用时,具有不同经验的trip persisting正在寻找经验实体上的级

  • 我有实体 和EcranChampId 每次尝试保存EcranChamp元素时,我都会出现以下错误 2018-09-25 12:15:42.889警告14216---[nio-8092-exec-8]。w、 s.m.s.DefaultHandlerExceptionResolver:无法转换请求元素:org。springframework。豆子。ConversionNotSupportedExcep

  • 我使用sharedpreferences保存了一些变量,但是我的save方法使应用程序崩溃,出现了空指针异常。 getSharedPreferences()本身不能工作,需要有上下文。在它之前,这可能是一个问题。我已经定义了上下文,导入了SharedPreferences,那么为什么这不起作用呢?

  • 在这个问题中,我正在使用Hibernate 4.3.4。最终和SpringORM 4.1.2。释放。 我有一个User类,它包含这样的一组Card实例: 我有几种类型的卡,每种都分别扩展Card基类和CardInstance基类,如下所示: 如果我将UnitCardInstance或HeroCardInstance添加到cards集合并保存实体,则一切正常。但是,如果我向集合中添加AbilityC

  • 输出给我抛出了这个错误: 我已经尝试按照OWL API示例中的说明进行保存,所以我不知道我的错误在哪里。 这是我用来保存本体的代码: 和getPatient的代码