嵌入式文档中的Doctrine Mongodb getOriginalDocumentData

时间:2018-03-08 14:18:16

标签: symfony doctrine-odm

在我的symfony应用程序中,我有了event_subscriber

rake db:migrate:status

我的订阅者只需收听postPersist和postUpdate事件:

CoreBundle\EventSubscriber\CloseIssueSubscriber:
        tags:
            - { name: doctrine_mongodb.odm.event_subscriber, connection: default }

在我的索引函数中,我需要做的是获取特定字段是否已更改,特别是issue.status字段。

public function getSubscribedEvents()
    {
        return array(
            'postPersist',
            'postUpdate',
        );
    }

    public function postPersist(LifecycleEventArgs $args)
    {
        $this->index($args);
    }

    public function postUpdate(LifecycleEventArgs $args)
    {
        $this->index($args);
    }

在我的测试中,我所做的是更改issue.status字段,所以我希望从var_dump中获得2个不同的值,但我从两个中获得最后一个状态。

我的文件就是这样的:

public function index(LifecycleEventArgs $args)
    {
        $document = $args->getEntity();

            $originalData = $uow->getOriginalDocumentData($document);

            $originalStatus = $originalData && !empty($originalData['issue']) ? $originalData['issue']->getStatus() : null;
            var_dump($originalStatus);
            var_dump($document->getIssue()->getStatus());die;
    }

}

在嵌入式问题文档中,状态只是一个文本字段。

我也尝试使用变更集:

class Payload
{
/**
 * @ODM\Id
 */
private $id;

/**
 * @ODM\EmbedOne(targetDocument="CoreBundle\Document\Issue\Issue")
 * @Type("CoreBundle\Document\Issue\Issue")
 */
protected $issue;

这两个var_dumps也会返回相同的状态。

2 个答案:

答案 0 :(得分:1)

postUpdate时,文档中的更改已经完成,因此调整了originalDocumentData并准备好进行新的计算。相反,您应该挂钩preUpdate事件并在那里使用$uow->getDocumentChangeSet($document);

我想你一旦将更改写入数据库就想运行index,所以在preUpdate上你可以在监听器中累积更改并另外挂钩postFlush事件来重新启动 - 索引文件。

答案 1 :(得分:0)

我找到了解决问题的方法。 malarzm在另一个答案中所说的是正确的,但不能解决我的问题 我想我只为文档(Payload)获得了一个postUpdate / preUpdate postPersist / prePersist而不是我注意到它被嵌入文档调用了事件(不知道为什么教义认为它是持久的)。

所以主要的问题是我在等待Payload对象而不是等待一个Issue对象。
在另一方面,即使在postUpdate和preUpdate中我也无法使用getOriginalDocumentData工作,所以我必须使用getDocumentChangeSet()。