2014-07-02 13 views
0

我的情况是这样的,首先存在一个实体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实体被持久。

希望有人一直处于相同的情况,可以给我一些建议,和平!

+0

在没有创建更新的情况下,您是否可以确认for循环的任何迭代都会越过'if(null === $ image)'? – Alex

+0

正如我所说,除了坚持相关实体(它甚至以另一种方法上传文件)之外,它做的一切除外,实际工作的一个解决方案是在更新人员时刷新两次,然后它还会持续添加新添加的Face实体,但是,感觉像Symfony的方法来解决它... – Rikard

+0

就我的理解而言,Person实体的更新不会触发相关实体上的任何持续级联,但是从我上面所述的他们在第二次冲洗,如果有人能够解释如何以正确的方式做到这一点,那将是太棒了。 – Rikard

回答

0

我有一个类似的项目,一个调查有问题,每个问题都有一个图像。

我跟着docs here和更新相关的实体我把所有的逻辑移动到该实体,这将是你的情况下的“面孔”。一切工作正常,我的控制器看起来像这样:

... 

$survey->preUpload(); 
$questions = $survey->getQuestions(); 
    foreach ($questions as $question) 
    { 
     $question->preUpload(); 
    } 

$em->persist($survey); 
$em->flush(); 

... 

希望有所帮助。

+0

毫无疑问,它可以以各种方式完成,正如我在评论中提到的,只需添加一秒刷新到更新操作,这解决了问题,确实确实保留了新添加的记录,但是我的疑惑更多关于为什么Symfony2在以这种方式添加新实体时没有运行任何插入操作,是关于PreUpdate )它不允许添加任何新的实体,Symfony2不会在这个特定的时间内改变实体的状态,我不知道... – Rikard

0

即使在关系的另一侧,您也需要指定一个级联持续策略。它不是自动双向的。

/** 
* @ORM\ManyToOne(targetEntity="Person", inversedBy="faces", cascade={"persist"}) 
*/ 
+0

你有任何解释为什么这样可以解决我的问题吗?阅读我对这个问题的评论,当Person获得第一次持续时,它确实坚持Face实体,但是当它更新时不持续。 – Rikard

+0

因为上传时,你坚持Face实体。这确实会触发Person实体上的级联持续,如果您按照我的建议添加它。 – Jean

+0

它不会明确地持久化任何Face实体,因为您可以看到名为addFace()的唯一方法,它只会追加应该与该特定Person相关联的面的列表,并将该级联选项添加到Face实体中,实际上改变了一切。是的,我试过了:) – Rikard