diff --git a/lib/Doctrine/ODM/MongoDB/Proxy/Factory/StaticProxyFactory.php b/lib/Doctrine/ODM/MongoDB/Proxy/Factory/StaticProxyFactory.php index 9d5e56938b..3dabf94ef0 100644 --- a/lib/Doctrine/ODM/MongoDB/Proxy/Factory/StaticProxyFactory.php +++ b/lib/Doctrine/ODM/MongoDB/Proxy/Factory/StaticProxyFactory.php @@ -14,9 +14,11 @@ use Doctrine\Persistence\NotifyPropertyChanged; use ProxyManager\Factory\LazyLoadingGhostFactory; use ProxyManager\Proxy\GhostObjectInterface; +use ReflectionClass; use ReflectionProperty; use function array_filter; +use function array_merge; use function count; /** @@ -130,6 +132,19 @@ private function createInitializer( * @return array */ private function skippedFieldsFqns(ClassMetadata $metadata): array + { + $skippedIdFieldsFqns = $this->getIdFieldsFqns($metadata); + $skippedNonMappedFieldsFqns = $this->getUnmappedPropertyFqns($metadata); + + return array_merge($skippedIdFieldsFqns, $skippedNonMappedFieldsFqns); + } + + /** + * @param ClassMetadata $metadata + * + * @return array + */ + private function getIdFieldsFqns(ClassMetadata $metadata): array { $idFieldFqcns = []; @@ -140,6 +155,30 @@ private function skippedFieldsFqns(ClassMetadata $metadata): array return $idFieldFqcns; } + /** + * @param ClassMetadata $metadata + * + * @return array + */ + private function getUnmappedPropertyFqns(ClassMetadata $metadata): array + { + $nonMappedFieldFqcns = []; + + $reflectionClass = new ReflectionClass($metadata->getName()); + + foreach ($reflectionClass->getProperties() as $property) { + $propertyName = $property->getName(); + + if ($metadata->hasField($propertyName)) { + continue; + } + + $nonMappedFieldFqcns[] = $this->propertyFqcn($property); + } + + return $nonMappedFieldFqcns; + } + private function propertyFqcn(ReflectionProperty $property): string { if ($property->isPrivate()) {