Symfony2 と Doctrine を使用しています
セッションにシリアル化/非シリアル化され、複数の画面で使用される教義エンティティがあります。このエンティティには、多数の 1 対多の関連付けがあります。
ドクトリン エンティティには、たとえば次の 1 対多があります。
class Article {
...
/**
* @ORM\OneToMany(targetEntity="image", mappedBy="article", cascade= {"merge","detach","persist"})
*/
protected $images;
public function __construct()
{
$this->images = new ArrayCollection();
}
.....
}
article エンティティは、次のように保存および取得されます。
public function saveArticle($article)
{
$articleSerialized = serialize($article);
$this->session->set('currentArticle',$articleSerialized);
}
public function getArticle()
{
$articleSerialized = $this->session->get('currentArticle');
$article = unserialize($articleSerialized);
$article = $this->em->merge($article);
return $article;
}
エンティティをセッションとの間で何度でも保存およびロードし、それをエンティティ マネージャにマージして保存することができます。これは、新しいエンティティの場合のみです。
ただし、データベースからエンティティをロードしてセッションに保存すると、問題が発生します。
他の投稿から、保存されたエンティティをシリアル化解除した後、 $em->merge($entity); を実行する必要があることを知っています。
エンティティをマージし、新しいサブエンティティ (1 対多) を追加して保存できます。
$article = $this->getArticle(); //Declared above, gets article from session
$image = new Image();
$image->setFilename('image.jpeg');
$article->addImage($image);
$this->saveArticle($article); //Declared above, returns the article to session
ただし、最初のマージと画像の追加の後、サブエンティティを追加できません。2 番目の画像を追加しようとすると、次のエラーが返されます。
A managed+dirty entity <<namespace of entity>>
image@0000000067078d7400000000221d7e02 can not
be scheduled for insertion.
要約すると、エンティティにいくつでも変更を加えてセッションに保存できますが、サブエンティティを追加するときに $em->merge を複数回実行すると、新しいサブエンティティがダーティとしてマークされます。
エンティティがダーティとマークされる理由を知っている人はいますか? エンティティ自体をリセットする必要がありますか? もしそうなら、どうすればそれを行うことができますか?