diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php index 85f928971..897f71de0 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php @@ -1188,7 +1188,7 @@ class ClassMetadataInfo implements ClassMetadata // Complete fieldName and columnName mapping if ( ! isset($mapping['columnName'])) { - $mapping['columnName'] = $this->namingStrategy->propertyToColumnName($mapping['fieldName']); + $mapping['columnName'] = $this->namingStrategy->propertyToColumnName($mapping['fieldName'], $this->name); } if ($mapping['columnName'][0] === '`') { @@ -1465,6 +1465,7 @@ class ClassMetadataInfo implements ClassMetadata if ( ! isset($mapping['joinTable']['name'])) { $mapping['joinTable']['name'] = $this->namingStrategy->joinTableName($mapping['sourceEntity'], $mapping['targetEntity'], $mapping['fieldName']); } + if ( ! isset($mapping['joinTable']['joinColumns'])) { $mapping['joinTable']['joinColumns'] = array(array( 'name' => $this->namingStrategy->joinKeyColumnName($mapping['sourceEntity']), diff --git a/lib/Doctrine/ORM/Mapping/DefaultNamingStrategy.php b/lib/Doctrine/ORM/Mapping/DefaultNamingStrategy.php index 4c64385b3..2433b4afa 100644 --- a/lib/Doctrine/ORM/Mapping/DefaultNamingStrategy.php +++ b/lib/Doctrine/ORM/Mapping/DefaultNamingStrategy.php @@ -45,7 +45,7 @@ class DefaultNamingStrategy implements NamingStrategy /** * {@inheritdoc} */ - public function propertyToColumnName($propertyName) + public function propertyToColumnName($propertyName, $className = null) { return $propertyName; } diff --git a/lib/Doctrine/ORM/Mapping/NamingStrategy.php b/lib/Doctrine/ORM/Mapping/NamingStrategy.php index a6acac255..73e289b75 100644 --- a/lib/Doctrine/ORM/Mapping/NamingStrategy.php +++ b/lib/Doctrine/ORM/Mapping/NamingStrategy.php @@ -42,9 +42,10 @@ interface NamingStrategy * Return a column name for a property * * @param string $propertyName A property + * @param string $className The fully-qualified class name * @return string A column name */ - function propertyToColumnName($propertyName); + function propertyToColumnName($propertyName, $className = null); /** * Return the default reference column name diff --git a/lib/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php b/lib/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php index 236ab5cfe..49a04feeb 100644 --- a/lib/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php +++ b/lib/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php @@ -80,7 +80,7 @@ class UnderscoreNamingStrategy implements NamingStrategy /** * {@inheritdoc} */ - public function propertyToColumnName($propertyName) + public function propertyToColumnName($propertyName, $className = null) { return $this->underscore($propertyName); } diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php index 954985e1f..fee6d822c 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php @@ -922,6 +922,26 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase $this->assertEquals('doctrineglobal_article_cms_cmsuser', $articleMetadata->associationMappings['author']['joinTable']['name']); } + /** + * @group DDC-984 + * @group DDC-559 + */ + public function testFullyQualifiedClassNameShouldBeGivenToNamingStrategyPropertyToColumnName() + { + $namingStrategy = new MyPrefixNamingStrategy(); + $metadata = new ClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress', $namingStrategy); + + $metadata->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + + $metadata->mapField(array('fieldName'=>'country')); + $metadata->mapField(array('fieldName'=>'city')); + + $this->assertEquals($metadata->fieldNames, array( + 'cmsaddress_country' => 'country', + 'cmsaddress_city' => 'city' + )); + } + /** * @group DDC-1746 */ @@ -993,3 +1013,14 @@ class MyNamespacedNamingStrategy extends \Doctrine\ORM\Mapping\DefaultNamingStra return strtolower($className); } } + +class MyPrefixNamingStrategy extends \Doctrine\ORM\Mapping\DefaultNamingStrategy +{ + /** + * {@inheritdoc} + */ + public function propertyToColumnName($propertyName, $className = null) + { + return strtolower($this->classToTableName($className)) . '_' . $propertyName; + } +} \ No newline at end of file