diff --git a/lib/Doctrine/ORM/Tools/SchemaTool.php b/lib/Doctrine/ORM/Tools/SchemaTool.php index 7b088f578..fb1ebfcc4 100644 --- a/lib/Doctrine/ORM/Tools/SchemaTool.php +++ b/lib/Doctrine/ORM/Tools/SchemaTool.php @@ -487,7 +487,7 @@ class SchemaTool $foreignClass = $this->em->getClassMetadata($mapping['targetEntity']); if ($mapping['type'] & ClassMetadata::TO_ONE && $mapping['isOwningSide']) { - $primaryKeyColumns = $uniqueConstraints = array(); // PK is unnecessary for this relation-type + $primaryKeyColumns = array(); // PK is unnecessary for this relation-type $this->gatherRelationJoinColumns( $mapping['joinColumns'], @@ -495,14 +495,9 @@ class SchemaTool $foreignClass, $mapping, $primaryKeyColumns, - $uniqueConstraints, $addedFks, $blacklistedFks ); - - foreach ($uniqueConstraints as $indexName => $unique) { - $table->addUniqueIndex($unique['columns'], is_numeric($indexName) ? null : $indexName); - } } elseif ($mapping['type'] == ClassMetadata::ONE_TO_MANY && $mapping['isOwningSide']) { //... create join table, one-many through join table supported later throw ORMException::notSupported(); @@ -514,7 +509,7 @@ class SchemaTool $this->quoteStrategy->getJoinTableName($mapping, $foreignClass, $this->platform) ); - $primaryKeyColumns = $uniqueConstraints = array(); + $primaryKeyColumns = array(); // Build first FK constraint (relation table => source table) $this->gatherRelationJoinColumns( @@ -523,7 +518,6 @@ class SchemaTool $class, $mapping, $primaryKeyColumns, - $uniqueConstraints, $addedFks, $blacklistedFks ); @@ -535,16 +529,11 @@ class SchemaTool $foreignClass, $mapping, $primaryKeyColumns, - $uniqueConstraints, $addedFks, $blacklistedFks ); $theJoinTable->setPrimaryKey($primaryKeyColumns); - - foreach ($uniqueConstraints as $indexName => $unique) { - $theJoinTable->addUniqueIndex($unique['columns'], is_numeric($indexName) ? null : $indexName); - } } } } @@ -595,7 +584,6 @@ class SchemaTool * @param ClassMetadata $class * @param array $mapping * @param array $primaryKeyColumns - * @param array $uniqueConstraints * @param array $addedFks * @param array $blacklistedFks * @@ -609,7 +597,6 @@ class SchemaTool $class, $mapping, &$primaryKeyColumns, - &$uniqueConstraints, &$addedFks, &$blacklistedFks ) { @@ -617,6 +604,7 @@ class SchemaTool $foreignColumns = array(); $fkOptions = array(); $foreignTableName = $this->quoteStrategy->getTableName($class, $this->platform); + $uniqueConstraints = array(); foreach ($joinColumns as $joinColumn) { @@ -686,6 +674,12 @@ class SchemaTool } } + // Prefer unique constraints over implicit simple indexes created for foreign keys. + // Also avoids index duplication. + foreach ($uniqueConstraints as $indexName => $unique) { + $theJoinTable->addUniqueIndex($unique['columns'], is_numeric($indexName) ? null : $indexName); + } + $compositeName = $theJoinTable->getName().'.'.implode('', $localColumns); if (isset($addedFks[$compositeName]) && ($foreignTableName != $addedFks[$compositeName]['foreignTableName']