diff --git a/lib/Doctrine/Common/DataFixtures/ProxyReferenceRepository.php b/lib/Doctrine/Common/DataFixtures/ProxyReferenceRepository.php index a00bde90..baf0bed7 100644 --- a/lib/Doctrine/Common/DataFixtures/ProxyReferenceRepository.php +++ b/lib/Doctrine/Common/DataFixtures/ProxyReferenceRepository.php @@ -64,7 +64,6 @@ public function serialize() $simpleReferences = array(); foreach ($this->getReferences() as $name => $reference) { - $reference = $this->getReference($name); $className = $this->getRealClass(get_class($reference)); $simpleReferences[$name] = array($className, $this->getIdentifier($reference, $unitOfWork)); diff --git a/lib/Doctrine/Common/DataFixtures/ReferenceRepository.php b/lib/Doctrine/Common/DataFixtures/ReferenceRepository.php index d3df4bd1..71ff3f3b 100644 --- a/lib/Doctrine/Common/DataFixtures/ReferenceRepository.php +++ b/lib/Doctrine/Common/DataFixtures/ReferenceRepository.php @@ -20,6 +20,7 @@ namespace Doctrine\Common\DataFixtures; use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Common\Persistence\Proxy; /** * ReferenceRepository class manages references for @@ -77,8 +78,20 @@ protected function getIdentifier($reference, $uow) // In case Reference is not yet managed in UnitOfWork if ( ! $uow->isInIdentityMap($reference)) { $class = $this->manager->getClassMetadata(get_class($reference)); - - return $class->getIdentifierValues($reference); + + $values = $class->getIdentifierValues($reference); + + // See https://github.com/doctrine/data-fixtures/issues/135 and + // https://github.com/doctrine/data-fixtures/issues/167 + foreach ($values as $key => $value) { + if (!is_scalar($value)) { // or: is_object? + $proxyId = $this->getIdentifier($value, $uow); + $keys = array_keys($proxyId); + $values[$key] = $proxyId[$keys[0]]; + } + } + + return $values; } // Dealing with ORM UnitOfWork