将实体传递给flush()方法允许Doctrine仅更新此实体,这对于优化非常有用。但是,当我这样做时,关系似乎没有更新。
示例:
$event->getEmails()->first()->setEmail('mynewemail@email.com');
$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.
* ...
*/
根据第一条规则,也会处理集合中的更改。我做错了什么,或者这是Doctrine的错误?
答案 0 :(得分:1)
使用$event->getEmails()->first()->setEmail('mynewemail@email.com');
您不会更新集合,而是集合中的一个实体。单个实体刷新不会更新Email
实体是正常的。
如果您写$event->addEmail($aNewEmailEntity);
(与删除相同),那么您在调用单个实体刷新时会看到该集合确实已更新。