我一直在关注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'
在条令文件中找到了一个很长问题的简单答案。
10.2。条令如何检测变化
要让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的代码