我在计算变更集的值时遇到问题。我需要当前一个中的参考实体的旧值和新值。事实是那些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?
由于
答案 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
}
我希望这会帮助别人,并像我一样浪费时间。