diff --git a/lib/Doctrine/ConfigurationFactory.php b/lib/Doctrine/ConfigurationFactory.php index ca4de48e4b..209233411b 100644 --- a/lib/Doctrine/ConfigurationFactory.php +++ b/lib/Doctrine/ConfigurationFactory.php @@ -38,6 +38,8 @@ class ConfigurationFactory { } private function configureMetadata(Configuration $configuration) { + $configuration->setClassMetadataFactoryName(TablePrefixMetadataFactory::class); + // metadata cache (for production cache is pre-generated at build time) $metadata_storage = new MetadataCache(self::METADATA_DIR); $configuration->setMetadataCacheImpl($metadata_storage); diff --git a/lib/Doctrine/TablePrefixMetadataFactory.php b/lib/Doctrine/TablePrefixMetadataFactory.php new file mode 100644 index 0000000000..043cd77a9a --- /dev/null +++ b/lib/Doctrine/TablePrefixMetadataFactory.php @@ -0,0 +1,47 @@ +prefix = Env::$db_prefix; + } + + function getMetadataFor($className) { + $isPrefixed = $this->hasMetadataFor($className); + $classMetadata = parent::getMetadataFor($className); + if (!$isPrefixed && $classMetadata instanceof ClassMetadata) { + $this->addPrefix($classMetadata); + } + return $classMetadata; + } + + function addPrefix(ClassMetadata $classMetadata) { + if (!$classMetadata->isInheritanceTypeSingleTable() || $classMetadata->getName() === $classMetadata->rootEntityName) { + $classMetadata->setPrimaryTable([ + 'name' => $this->prefix . $classMetadata->getTableName(), + ]); + } + + foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) { + if ($mapping['type'] == ClassMetadataInfo::MANY_TO_MANY && $mapping['isOwningSide']) { + $mappedTableName = $mapping['joinTable']['name']; + $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName; + } + } + } +}