计算属性中具有代理实体的对象的changeSet以用于记录目的 - Doctrine

时间:2016-04-06 09:19:10

标签: symfony doctrine-orm entity

我在计算变更集的值时遇到问题。我需要当前一个中的参考实体的旧值和新值。事实是那些entites填充了代理对象,以避免从db加载它。因为我已经知道ID的旧值和新值。所以代码看起来像这样:

// in code
$entity->setEntity1($em->getReference(Entity1::class, $id));

...

// event callback for getting diff
protected function postUpdate(LifecycleEventArgs $args)
{
    $em            = $args->getEntityManager();
    $uow           = $em->getUnitOfWork();
    $entity        = $args->getEntity();
    $classMetadata = $em->getClassMetadata(get_class($entity));

    $uow->computeChangeSet($classMetadata, $entity);
    $changeSet = $uow->getEntityChangeSet($entity);
    echo json_encode($changeSet);
}

结果

{
    "entity1": [
        {
            "__initializer__": {},
            "__cloner__": {},
            "__isInitialized__": false
        },
        {
            "__initializer__": {},
            "__cloner__": {},
            "__isInitialized__": false
        }
    ]
}

所需的输出将是:

{
    "entity1": [ 101, 105]
}

因此代理实体被转换为其属性。 如何避免这样做而只改为ID?

由于

1 个答案:

答案 0 :(得分:0)

解决方案非常简单。我被json的打印输出所迷惑。 changeSet的那个键里面的对象并不简单。它是整个代理对象所以解决方案只是调用该代理的getId并替换更改集数组中的值。

// event callback for getting diff
protected function postUpdate(LifecycleEventArgs $args)
{
    $em            = $args->getEntityManager();
    $uow           = $em->getUnitOfWork();
    $entity        = $args->getEntity();
    $classMetadata = $em->getClassMetadata(get_class($entity));

    $uow->computeChangeSet($classMetadata, $entity);
    $changeSet = $uow->getEntityChangeSet($entity);

    if (array_key_exists('entity1', $changeSet) {
        if ($changeSet['entity1'][0] != null) {
            $changeSet['entity1'][0] = $changeSet['entity1'][0]->getId();
        }

        if ($changeSet['entity1'][1] != null) {
           $changeSet['entity1'][1] = $changeSet['entity1'][1]->getId();
        }
    }
    // do something with it
}

我希望这会帮助别人,并像我一样浪费时间。