刷新单个实体不会更新关系

时间:2016-11-30 14:43:20

标签: php symfony doctrine-orm

将实体传递给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的错误?

1 个答案:

答案 0 :(得分:1)

使用$event->getEmails()->first()->setEmail('mynewemail@email.com');您不会更新集合,而是集合中的一个实体。单个实体刷新不会更新Email实体是正常的。

如果您写$event->addEmail($aNewEmailEntity);(与删除相同),那么您在调用单个实体刷新时会看到该集合确实已更新。