0

我正在我的控制器中修改文件操作。子实体(StrOrigin)与文件实体有以下关系:

/**
* @ORM\ManyToOne(targetEntity="File" )
* @ORM\JoinColumn(name="STOR_FILE", referencedColumnName="id", onDelete="CASCADE")
*/

现在在控制器中的修改操作中,我获取要修改的文件,设置表单并进行一些测试,然后上传文件,保存文件实体并用新修改的文​​件覆盖 StrOrigin(这是文件中的许多字符串)。我被困在如何覆盖 StrOrigin。在提交和保存新文件时,我尝试删除旧文件:

 $this_file_STROR=$em->getRepository('File')->find(array('id'=>$idfile));
                    $em->remove($this_file_STROR);
                    $em->flush();

但这似乎不起作用。

4

2 回答 2

0

我找到了另一个可能更快的解决方案:

此处对其进行了描述,称为孤儿删除。这个想法是简单地删除关联并告诉学说不再引用的相关实体将被删除。在您的情况下,您将执行以下操作:

/** 
* @ORM\ManyToOne(targetEntity="File" ) 
* @ORM\JoinColumn(name="STOR_FILE", referencedColumnName="id", orphanRemoval=true) 
*/

public function deleteStrOrigins(){
        $this->strOrigins = new ArrayCollection(); // you can also try to use = null. I'm using ArrayCollections, so this is my way and I never tried the null approach.
}

现在调用您的代码

$this_file_STROR=$em->getRepository('File')->find($idfile);
$this_file_STROR->deleteStrOrigins();
$em->flush();

应该删除所有相关的 StrOrigins,只要它们在其他任何地方都不相关。

于 2012-04-24T21:26:51.087 回答
0

跟进评论:

您不想删除您的实际文件。你误解了onDelete="CASCADE"!这意味着当您删除文件时,所有 StrOrigin 也将被删除。它与您想要实现的目标无关。

你想要的是以下内容:

$this_file_STROR=$em->getRepository('File')->find($idfile);
foreach($this_file_STROR->getStrOrigins() AS $strOrigin){
  $em->remove($strOrigin);
}
// now $this_file_STROR as no StrOrigins anymore
$em->flush();

另请注意,此时您不需要冲洗。刷新只是将您当前的对象持久化到数据库中。只要您使用对象,就无需刷新。通常你可以在你的脚本结束之前刷新,例如在你调用你的控制器中的渲染之前。如果您多次刷新,您的应用程序可能会由于与数据库的交互而变慢。

于 2012-04-12T20:08:07.180 回答