/** * @return ClassMetadata */ public static function getMetadata() { $metadata = new ClassMetadata(static::class); $metadata->setIdentifier(['id']); $metadata->mapField(['fieldName' => 'id']); $metadata->mapField(['fieldName' => 'a']); $metadata->mapField(['fieldName' => 'b']); $metadata->mapField(['fieldName' => 'c']); $metadata->mapEmbedded(['fieldName' => 'd', 'class' => DummyEmbeddable::class, 'columnPrefix' => 'd']); $metadata->mapManyToOne(['fieldName' => 'parent', 'targetEntity' => self::class, 'inversedBy' => 'children']); $metadata->mapOneToMany(['fieldName' => 'children', 'targetEntity' => self::class, 'mappedBy' => 'parent']); $metadata->wakeupReflection(new RuntimeReflectionService()); return $metadata; }
private function remapActions(ClassMetadata $metadata, ClassMetadataFactory $metadataFactory) { $fieldName = 'actions'; unset($metadata->fieldMappings[$fieldName]); unset($metadata->embeddedClasses[$fieldName]); // Re-map the embeddable $mapping = ['fieldName' => $fieldName, 'class' => $this->actionsClass, 'columnPrefix' => null]; $metadata->mapEmbedded($mapping); // Remove the existing inlined fields foreach ($metadata->fieldMappings as $name => $fieldMapping) { if (isset($fieldMapping['declaredField']) && $fieldMapping['declaredField'] === $fieldName) { unset($metadata->fieldMappings[$name]); unset($metadata->fieldNames[$fieldMapping['columnName']]); } } // Re-inline the embeddable $embeddableMetadata = $metadataFactory->getMetadataFor($this->actionsClass); $metadata->inlineEmbeddable($fieldName, $embeddableMetadata); }
/** * Adds nested embedded classes metadata to a parent class. * * @param ClassMetadata $subClass Sub embedded class metadata to add nested embedded classes metadata from. * @param ClassMetadata $parentClass Parent class to add nested embedded classes metadata to. * @param string $prefix Embedded classes' prefix to use for nested embedded classes field names. */ private function addNestedEmbeddedClasses(ClassMetadata $subClass, ClassMetadata $parentClass, $prefix) { foreach ($subClass->embeddedClasses as $property => $embeddableClass) { if (isset($embeddableClass['inherited'])) { continue; } $embeddableMetadata = $this->getMetadataFor($embeddableClass['class']); $parentClass->mapEmbedded(array('fieldName' => $prefix . '.' . $property, 'class' => $embeddableMetadata->name, 'columnPrefix' => $embeddableClass['columnPrefix'], 'declaredField' => $embeddableClass['declaredField'] ? $prefix . '.' . $embeddableClass['declaredField'] : $prefix, 'originalField' => $embeddableClass['originalField'] ?: $property)); } }
public function testWakeupReflectionWithEmbeddableAndStaticReflectionService() { $classMetadata = new ClassMetadata('Doctrine\\Tests\\ORM\\Mapping\\TestEntity1'); $classMetadata->mapEmbedded(array('fieldName' => 'test', 'class' => 'Doctrine\\Tests\\ORM\\Mapping\\TestEntity1', 'columnPrefix' => false)); $field = array('fieldName' => 'test.embeddedProperty', 'type' => 'string', 'originalClass' => 'Doctrine\\Tests\\ORM\\Mapping\\TestEntity1', 'declaredField' => 'test', 'originalField' => 'embeddedProperty'); $classMetadata->mapField($field); $classMetadata->wakeupReflection(new StaticReflectionService()); $this->assertEquals(array('test' => null, 'test.embeddedProperty' => null), $classMetadata->getReflectionProperties()); }