如何更新Symfony2中的相关实体
我的情况是这样的,首先存在一个实体Person,它与实体Face具有OneToMany关系(当然还有ManyToOne的其他方法),并且每次更新Person实体时我可能会向Person添加一些额外的Face实体。基本上,它看起来是这样的:如何更新Symfony2中的相关实体
/**
* @ORM\OneToMany(targetEntity="Face", mappedBy="person", cascade={"persist"})
*/
private $faces;
...
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
foreach ($this->images as $image) {
if (null === $image) {
break;
}
$face = new Face();
$face->setPerson($this);
$face->setImagePath(sha1(uniqid(mt_rand(), true)));
$this->addFace($face);
}
}
可正常工作,当我做坚持与一些面子实体首次的人,但是当我尝试更新现有的人更增添脸部的实体,我不能让他们坚持,应该发生的一切,除了没有新的Face实体被持久。
希望有人一直处于相同的情况,可以给我一些建议,和平!
我有一个类似的项目,一个调查有问题,每个问题都有一个图像。
我跟着docs here和更新相关的实体我把所有的逻辑移动到该实体,这将是你的情况下的“面孔”。一切工作正常,我的控制器看起来像这样:
...
$survey->preUpload();
$questions = $survey->getQuestions();
foreach ($questions as $question)
{
$question->preUpload();
}
$em->persist($survey);
$em->flush();
...
希望有所帮助。
毫无疑问,它可以以各种方式完成,正如我在评论中提到的,只需添加一秒刷新到更新操作,这解决了问题,确实确实保留了新添加的记录,但是我的疑惑更多关于为什么Symfony2在以这种方式添加新实体时没有运行任何插入操作,是关于PreUpdate )它不允许添加任何新的实体,Symfony2不会在这个特定的时间内改变实体的状态,我不知道... – Rikard
即使在关系的另一侧,您也需要指定一个级联持续策略。它不是自动双向的。
/**
* @ORM\ManyToOne(targetEntity="Person", inversedBy="faces", cascade={"persist"})
*/
在没有创建更新的情况下,您是否可以确认for循环的任何迭代都会越过'if(null === $ image)'? – Alex
正如我所说,除了坚持相关实体(它甚至以另一种方法上传文件)之外,它做的一切除外,实际工作的一个解决方案是在更新人员时刷新两次,然后它还会持续添加新添加的Face实体,但是,感觉像Symfony的方法来解决它... – Rikard
就我的理解而言,Person实体的更新不会触发相关实体上的任何持续级联,但是从我上面所述的他们在第二次冲洗,如果有人能够解释如何以正确的方式做到这一点,那将是太棒了。 – Rikard