Skip to content

Metadata export/load not working on subclass (xml/yaml format) #7718

Open
@mastir

Description

@mastir

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions