Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8f4960a

Browse files
committed
doctrine#1130 DDC-3300 - re-mapping discriminator column at runtime (based on modified class metadata)
1 parent 97094be commit 8f4960a

1 file changed

Lines changed: 27 additions & 2 deletions

File tree

lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
use Doctrine\ORM\Id\BigIntegerIdentityGenerator;
3131
use Doctrine\ORM\Id\IdentityGenerator;
3232
use Doctrine\ORM\ORMException;
33+
use Exception;
3334
use ReflectionException;
3435

3536
/**
@@ -70,6 +71,30 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory
7071
*/
7172
private $embeddablesActiveNesting = array();
7273

74+
/**
75+
* {@inheritDoc}
76+
*/
77+
protected function loadMetadata($name)
78+
{
79+
/* @var $loaded string[] */
80+
$loaded = parent::loadMetadata($name);
81+
82+
foreach ($loaded as $className) {
83+
/* @var $metadata ClassMetadata */
84+
$metadata = $this->getMetadataFor($className);
85+
86+
if (! $metadata->discriminatorValue) {
87+
foreach ($metadata->discriminatorMap as $discriminatorValue => $discriminatorClass) {
88+
if ($metadata->name === $this->getMetadataFor($discriminatorClass)->getName()) {
89+
$metadata->discriminatorValue = $discriminatorValue;
90+
}
91+
}
92+
}
93+
}
94+
95+
return $loaded;
96+
}
97+
7398
/**
7499
* @param EntityManagerInterface $em
75100
*/
@@ -266,9 +291,9 @@ protected function validateRuntimeMetadata($class, $parent)
266291
if ( ! $class->discriminatorColumn) {
267292
throw MappingException::missingDiscriminatorColumn($class->name);
268293
}
269-
} else if ($parent && !$class->reflClass->isAbstract() && !in_array($class->name, array_values($class->discriminatorMap))) {
294+
} else if (! $class->reflClass->isAbstract() && !in_array($class->name, array_values($class->discriminatorMap))) {
270295
// enforce discriminator map for all entities of an inheritance hierarchy, otherwise problems will occur.
271-
throw MappingException::mappedClassNotPartOfDiscriminatorMap($class->name, $class->rootEntityName);
296+
//throw MappingException::mappedClassNotPartOfDiscriminatorMap($class->name, $class->rootEntityName);
272297
}
273298
} else if ($class->isMappedSuperclass && $class->name == $class->rootEntityName && (count($class->discriminatorMap) || $class->discriminatorColumn)) {
274299
// second condition is necessary for mapped superclasses in the middle of an inheritance hierarchy

0 commit comments

Comments
 (0)