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();

また、この時点でフラッシュする必要がないことに注意してください。フラッシュは、現在のオブジェクトをデータベースに永続化するだけです。オブジェクトを操作する限り、フラッシュする必要はありません。通常、スクリプトが終了する直前、たとえばコントローラーで render を呼び出す前にフラッシュできます。数回フラッシュすると、データベースとのやり取りが原因でアプリケーションが遅くなる可能性があります。

于 2012-04-12T20:08:07.180 に答える