2016-11-30 10 views
0

エンティティをflush()メソッドに渡すと、Doctrineはこのエンティティのみを更新できます。これは最適化に最適です。しかし、私がこれをやっているとき、関係は更新されていないようです。単一のエンティティをフラッシュするとリレーションが更新されない

例:

$event->getEmails()->first()->setEmail('[email protected]'); 
    $em->flush($event); // Emails wont be updated 
    $em->flush(); // Emails will be updated 

マッピング:

class Event 
{ 
    /** 
    * @var ArrayCollection|Email[] 
    * 
    * @ORM\OneToMany(targetEntity="Email", mappedBy="event", cascade={"all"}, orphanRemoval=true) 
    * @ORM\OrderBy({"id"="asc"}) 
    */ 
    protected $emails; 

私はDoctrineのコード内でチェックされ、ここで私が見つけたものです:私は、単一のエンティティをフラッシュする場合、内部で、方法computeSingleEntityChangeSetが呼び出されます。この方法の上のコメントは次のとおりです。

/** 
* Only flushes the given entity according to a ruleset that keeps the UoW consistent. 
* 
* 1. All entities scheduled for insertion, (orphan) removals and changes in collections are processed as well! 
* 2. Read Only entities are skipped. 
* 3. Proxies are skipped. 
* 4. Only if entity is properly managed. 
* ... 
*/ 

最初のルールに従って、コレクションの変更も処理されます。私は何か間違っているのですか?これは教義のバグですか?

+0

私はこれを双方向の関連付けでしか見ていません。私はDocs(またはどこか)で、カスケードが単方向であれば関連性のためだけに働くことを読んでいることを覚えています。 –

+0

私は一般に、単一エンティティのフラッシュが信頼できないと判断し、それを離れました。 – Tom

+1

だから、単一のエンティティとの 'flush'呼び出しは非推奨にする必要があります。https://github.com/doctrine/doctrine2/issues/6118カスケード操作が含まれているとエンティティを管理できません。 – Federkun

答えて

1

$event->getEmails()->first()->setEmail('[email protected]');では、コレクションを更新するのではなく、コレクション内の1つのエンティティを更新します。単一のエンティティがフラッシュしてEmailエンティティを更新しないのは正常です。

$event->addEmail($aNewEmailEntity);(removeと同じ)を書くと、単一のエンティティを呼び出すときにコレクションが実際に更新されることがわかります。

+0

それは意味があります、PHPDoc本当に明確ではありませんでした。ありがとうございました :) –

関連する問題