Open
Description
Bug Report
Metadata drivers unable to load metadatas exported via Doctrine\ORM\Tools\Export\Driver*Exporter for child classes.
Q | A |
---|---|
BC Break | no |
Version | 2.6.3 |
PHP | 7.1 |
Summary
Exporter tool exports all fields/ids/relations including parent class defined.
Metadata driver loads parent fields/ids/relations first and then throw "Duplicate definition" Exception.
How to reproduce
/**
* @ORM\Entity
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorMap({"a" = "A", "b" = "B"})
*/
class A{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
public $id;
/**
* @var string
* @ORM\Column(name="title", type="string", length=255)
*/
protected $title;
}
/**
* @ORM\Entity
*/
class B extends A{
/**
* @var string
* @ORM\Column(name="text", type="string", length=255)
*/
protected $text;
}
$em = getEntityManagerWithAnnotationDriver();
$path = getMetdataFolderPath();
$cme = new \Doctrine\ORM\Tools\Export\ClassMetadataExporter();
$exporter = $cme->getExporter('xml',$path);
$exporter->setMetadata($em->getMetadataFactory()->getAllMetadata());
$exporter->setOverwriteExistingFiles(true);
$exporter->export();
$config = clone $em->getConfiguration();
$config->setMetadataDriverImpl(new \Doctrine\ORM\Mapping\Driver\XmlDriver($path));
$config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache);
$em2 = \Doctrine\ORM\EntityManager::create($em->getConnection(), $config, $em->getConnection()->getEventManager());
$metadata = $em2->getMetadataFactory()->getAllMetadata();
Exception
for xml
#Fatal error:
Uncaught Doctrine\ORM\Mapping\MappingException: Duplicate definition of column 'title' on entity 'Content\B' in a field or discriminator column mapping. in /dir/lib/vendor/Doctrine/ORM/Mapping/MappingException.php:575
Stack trace:
#0 /dir/lib/vendor/Doctrine/ORM/Mapping/ClassMetadataInfo.php(1411): Doctrine\ORM\Mapping\MappingException::duplicateColumnName('Content\\B', 'title') #1 /dir/lib/vendor/Doctrine/ORM/Mapping/ClassMetadataInfo.php(2358): Doctrine\ORM\Mapping\ClassMetadataInfo->_validateAndCompleteFieldMapping(Array)
#2 /dir/lib/vendor/Doctrine/ORM/Mapping/Driver/XmlDriver.php(261): Doctrine\ORM\Mapping\ClassMetadataInfo->mapField(Array)
#3 /dir/lib/vendor/Doctrine/ORM/Mapping/ClassMetadataFactory.php(151): Doctrine\ORM\Mapping\Driver\XmlDriver->loadMetadataForClass('Content\\B', Object(Doctrine\ORM\Mapping\Cl in /dir/lib/vendor/Doctrine/ORM/Mapping/MappingException.php on line 575
for yaml
Fatal error: Uncaught Doctrine\ORM\Mapping\MappingException: Duplicate definition of column 'id' on entity 'Content\B' in a field or discriminator column mapping. in lib/vendor/Doctrine/ORM/Mapping/MappingException.php:575
Stack trace:
#0 lib/vendor/Doctrine/ORM/Mapping/ClassMetadataInfo.php(1411): Doctrine\ORM\Mapping\MappingException::duplicateColumnName('Content\\B', 'id')
#1 lib/vendor/Doctrine/ORM/Mapping/ClassMetadataInfo.php(2358): Doctrine\ORM\Mapping\ClassMetadataInfo->_validateAndCompleteFieldMapping(Array)
#2 vendor/Doctrine/ORM/Mapping/Driver/YamlDriver.php(296): Doctrine\ORM\Mapping\ClassMetadataInfo->mapField(Array)
#3 lib/vendor/Doctrine/ORM/Mapping/ClassMetadataFactory.php(151): Doctrine\ORM\Mapping\Driver\YamlDriver->loadMetadataForClass('Content\\B', Object(Doctrine\ORM\Mapping\ClassM in lib/vendor/Doctrine/ORM/Mapping/MappingException.php on line 575
Expected behavior
no exception thrown