迭代Doctrine的changeSet

时间:2015-04-21 02:59:02

标签: php arrays symfony doctrine-orm

我正在尝试记录用户在我的网站上执行的特定操作,并让侦听器检查某些实体是否正在更新,如果是,我的目标是记录他们正在编辑的字段,但不是所有字段(某些字段)不重要或太长了。)

我在将更改集保存到数据库时遇到问题,这就是我想要过滤重要字段的原因。这可以保存更改集,但是当变更集中有多个嵌套数组时,数组未正确保存(它在数组中的3个左右数组后切断)。我在postgres中使用数组类型。在我的postupdate活动中,我有:

if ($entity instanceof ListingQuery) {
        $entityManager = $eventArgs->getEntityManager();
        $ul = new UserLog();
        $uow = $entityManager->getUnitOfWork();
        $changeset = $uow->getEntityChangeSet($entity);
        $ul = new UserLog();
        $ul->setLog($changeset);
        $ul->setUser($entity->getUser());
        $entityManager->persist($ul);
        $entityManager->flush();
    }

我一直在查看文档,但我不确定如何迭代$ changeset。它是一个多维数组,可以根据更新的字段数包含可变数量的数组。 Userlog是我用来保存$ changeset的简单实体,而log字段是一个数组。

我创建了一个函数,该函数接受$ changeset并循环遍历数组的前三个级别,但它不保存字段的名称,只保存之前和之后的值。如何访问$ changeset中更改的字段名称?

1 个答案:

答案 0 :(得分:1)

我认为我的解决方案效果很好。它添加了实体类型,因此它与Doctrine2中的变更集完全不匹配,但我认为适用于我的目的。我发现一些其他帖子形成了人们试图记录Doctrine中具体混合结果的特定更改,所以如果其他人有更好的解决方案请发帖。

public function looparray($arr, $type) {
    $recordset[] = array($type);
    $keys[] = array_keys($arr);
    foreach ($keys as $key) {
        if (!is_array($key)) {
            if (array_key_exists($key, $arr)) {
                $recordset[] = array($key => $arr[$key]);
            }
        } else {
            foreach ($key as $key1) {
                if (!is_array([$key1])) {
                    $recordset[] = array($key1 => $arr[$key1]);
                } else {
                    if (!is_array([$key1])) {
                        $recordset[] = array($key1 => $arr[$key1]);
                    } else {
                        $recordset[] = array($key1 . ' changed ' => $key1);
                    }
                }
            }
        }
    }
    return $recordset;
}