エンティティを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.
* ...
*/
最初のルールに従って、コレクションの変更も処理されます。私は何か間違っているのですか?これは教義のバグですか?
私はこれを双方向の関連付けでしか見ていません。私はDocs(またはどこか)で、カスケードが単方向であれば関連性のためだけに働くことを読んでいることを覚えています。 –
私は一般に、単一エンティティのフラッシュが信頼できないと判断し、それを離れました。 – Tom
だから、単一のエンティティとの 'flush'呼び出しは非推奨にする必要があります。https://github.com/doctrine/doctrine2/issues/6118カスケード操作が含まれているとエンティティを管理できません。 – Federkun