diff --git a/docs/en/reference/namingstrategy.rst b/docs/en/reference/namingstrategy.rst index e1a29cd3e..9d82d8d8b 100644 --- a/docs/en/reference/namingstrategy.rst +++ b/docs/en/reference/namingstrategy.rst @@ -78,7 +78,7 @@ a "naming standard" for database tables and columns. * @param string $propertyName A property * @return string A join column name */ - function joinColumnName($propertyName); + function joinColumnName($propertyName, $className = null); /** * Return a join table name @@ -124,7 +124,7 @@ You need to implements NamingStrategy first. Following is an example { return 'id'; } - public function joinColumnName($propertyName) + public function joinColumnName($propertyName, $className = null) { return $propertyName . '_' . $this->referenceColumnName(); } diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php index bbfae15f0..67567456c 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php @@ -1553,7 +1553,7 @@ class ClassMetadataInfo implements ClassMetadata if ( ! isset($mapping['joinColumns']) || ! $mapping['joinColumns']) { // Apply default join column $mapping['joinColumns'] = array(array( - 'name' => $this->namingStrategy->joinColumnName($mapping['fieldName']), + 'name' => $this->namingStrategy->joinColumnName($mapping['fieldName'], $this->name), 'referencedColumnName' => $this->namingStrategy->referenceColumnName() )); } @@ -1571,7 +1571,7 @@ class ClassMetadataInfo implements ClassMetadata } if (empty($joinColumn['name'])) { - $joinColumn['name'] = $this->namingStrategy->joinColumnName($mapping['fieldName']); + $joinColumn['name'] = $this->namingStrategy->joinColumnName($mapping['fieldName'], $this->name); } if (empty($joinColumn['referencedColumnName'])) { diff --git a/lib/Doctrine/ORM/Mapping/DefaultNamingStrategy.php b/lib/Doctrine/ORM/Mapping/DefaultNamingStrategy.php index 06bc593be..1e75f9794 100644 --- a/lib/Doctrine/ORM/Mapping/DefaultNamingStrategy.php +++ b/lib/Doctrine/ORM/Mapping/DefaultNamingStrategy.php @@ -69,7 +69,7 @@ class DefaultNamingStrategy implements NamingStrategy /** * {@inheritdoc} */ - public function joinColumnName($propertyName) + public function joinColumnName($propertyName, $className = null) { return $propertyName . '_' . $this->referenceColumnName(); } diff --git a/lib/Doctrine/ORM/Mapping/NamingStrategy.php b/lib/Doctrine/ORM/Mapping/NamingStrategy.php index 94938ccf2..8845cb1ed 100644 --- a/lib/Doctrine/ORM/Mapping/NamingStrategy.php +++ b/lib/Doctrine/ORM/Mapping/NamingStrategy.php @@ -70,10 +70,12 @@ interface NamingStrategy * Returns a join column name for a property. * * @param string $propertyName A property name. + * @param string|null $className The fully-qualified class name. + * This parameter is omitted from the signature due to BC * * @return string A join column name. */ - function joinColumnName($propertyName); + function joinColumnName($propertyName/*, $className = null*/); /** * Returns a join table name. diff --git a/lib/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php b/lib/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php index ec74373a8..543d92ba3 100644 --- a/lib/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php +++ b/lib/Doctrine/ORM/Mapping/UnderscoreNamingStrategy.php @@ -106,7 +106,7 @@ class UnderscoreNamingStrategy implements NamingStrategy /** * {@inheritdoc} */ - public function joinColumnName($propertyName) + public function joinColumnName($propertyName, $className = null) { return $this->underscore($propertyName) . '_' . $this->referenceColumnName(); } diff --git a/tests/Doctrine/Tests/ORM/Mapping/NamingStrategy/JoinColumnClassNamingStrategy.php b/tests/Doctrine/Tests/ORM/Mapping/NamingStrategy/JoinColumnClassNamingStrategy.php new file mode 100644 index 000000000..8de8fa940 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/NamingStrategy/JoinColumnClassNamingStrategy.php @@ -0,0 +1,39 @@ +. + */ + +namespace Doctrine\Tests\ORM\Mapping\NamingStrategy; + +use Doctrine\ORM\Mapping\DefaultNamingStrategy; + +/** + * Stub naming strategy to verify `joinColumnName` proper behavior + */ +class JoinColumnClassNamingStrategy extends DefaultNamingStrategy +{ + /** + * {@inheritdoc} + */ + public function joinColumnName($propertyName, $className = null) + { + return strtolower($this->classToTableName($className)) + . '_' . $propertyName + . '_' . $this->referenceColumnName(); + } +} diff --git a/tests/Doctrine/Tests/ORM/Mapping/NamingStrategyTest.php b/tests/Doctrine/Tests/ORM/Mapping/NamingStrategyTest.php index 61decf2e7..16f0fe576 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/NamingStrategyTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/NamingStrategyTest.php @@ -5,6 +5,7 @@ namespace Doctrine\Tests\ORM\Mapping; use Doctrine\ORM\Mapping\UnderscoreNamingStrategy; use Doctrine\ORM\Mapping\DefaultNamingStrategy; use Doctrine\ORM\Mapping\NamingStrategy; +use Doctrine\Tests\ORM\Mapping\NamingStrategy\JoinColumnClassNamingStrategy; /** * @group DDC-559 @@ -162,20 +163,15 @@ class NamingStrategyTest extends \Doctrine\Tests\OrmTestCase { return array( // DefaultNamingStrategy - array(self::defaultNaming(), 'someColumn_id', - 'someColumn', null, - ), - array(self::defaultNaming(), 'some_column_id', - 'some_column', null, - ), + array(self::defaultNaming(), 'someColumn_id', 'someColumn', null), + array(self::defaultNaming(), 'some_column_id', 'some_column', null), // UnderscoreNamingStrategy - array(self::underscoreNamingLower(), 'some_column_id', - 'someColumn', null, - ), - array(self::underscoreNamingUpper(), 'SOME_COLUMN_ID', - 'someColumn', null, - ), + array(self::underscoreNamingLower(), 'some_column_id', 'someColumn', null), + array(self::underscoreNamingUpper(), 'SOME_COLUMN_ID', 'someColumn', null), + // JoinColumnClassNamingStrategy + array(new JoinColumnClassNamingStrategy(), 'classname_someColumn_id', 'someColumn', 'Some\ClassName'), + array(new JoinColumnClassNamingStrategy(), 'classname_some_column_id', 'some_column', 'ClassName'), ); } @@ -186,9 +182,9 @@ class NamingStrategyTest extends \Doctrine\Tests\OrmTestCase * @param string $expected * @param string $propertyName */ - public function testJoinColumnName(NamingStrategy $strategy, $expected, $propertyName) + public function testJoinColumnName(NamingStrategy $strategy, $expected, $propertyName, $className = null) { - $this->assertEquals($expected, $strategy->joinColumnName($propertyName)); + $this->assertEquals($expected, $strategy->joinColumnName($propertyName, $className)); } /**