From a26464da4ca21aedfd5225741b729caf95baf1ec Mon Sep 17 00:00:00 2001 From: beberlei Date: Tue, 8 Dec 2009 21:52:26 +0000 Subject: [PATCH] [2.0] DDC-169 - Fix Bug in SchemaTool Unique Handling --- lib/Doctrine/ORM/Tools/SchemaTool.php | 6 +++- .../SchemaTool/MySqlSchemaToolTest.php | 2 +- .../Tests/ORM/Tools/SchemaToolTest.php | 35 +++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 tests/Doctrine/Tests/ORM/Tools/SchemaToolTest.php diff --git a/lib/Doctrine/ORM/Tools/SchemaTool.php b/lib/Doctrine/ORM/Tools/SchemaTool.php index ab94a2a00..6889659e0 100644 --- a/lib/Doctrine/ORM/Tools/SchemaTool.php +++ b/lib/Doctrine/ORM/Tools/SchemaTool.php @@ -288,7 +288,6 @@ class SchemaTool $options['notnull'] = isset($mapping['nullable']) ? ! $mapping['nullable'] : true; $options['platformOptions'] = array(); - $options['platformOptions']['unique'] = isset($mapping['unique']) ? $mapping['unique'] : false; $options['platformOptions']['version'] = $class->isVersioned && $class->versionField == $mapping['fieldName'] ? true : false; if(strtolower($columnType) == 'string' && $options['length'] === null) { @@ -313,6 +312,11 @@ class SchemaTool } else { $table->createColumn($columnName, $columnType, $options); } + + $isUnique = isset($mapping['unique']) ? $mapping['unique'] : false; + if ($isUnique) { + $table->addUniqueIndex(array($columnName)); + } } /** diff --git a/tests/Doctrine/Tests/ORM/Functional/SchemaTool/MySqlSchemaToolTest.php b/tests/Doctrine/Tests/ORM/Functional/SchemaTool/MySqlSchemaToolTest.php index a3f3b86dc..d45707d80 100644 --- a/tests/Doctrine/Tests/ORM/Functional/SchemaTool/MySqlSchemaToolTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/SchemaTool/MySqlSchemaToolTest.php @@ -28,7 +28,7 @@ class MySqlSchemaToolTest extends \Doctrine\Tests\OrmFunctionalTestCase $sql = $tool->getCreateSchemaSql($classes); $this->assertEquals(8, count($sql)); $this->assertEquals("CREATE TABLE cms_addresses (id INT AUTO_INCREMENT NOT NULL, country VARCHAR(50) NOT NULL, zip VARCHAR(50) NOT NULL, city VARCHAR(50) NOT NULL, user_id INT DEFAULT NULL, PRIMARY KEY(id)) ENGINE = InnoDB", $sql[0]); - $this->assertEquals("CREATE TABLE cms_users (id INT AUTO_INCREMENT NOT NULL, status VARCHAR(50) NOT NULL, username VARCHAR(255) NOT NULL UNIQUE, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB", $sql[1]); + $this->assertEquals("CREATE TABLE cms_users (id INT AUTO_INCREMENT NOT NULL, status VARCHAR(50) NOT NULL, username VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, UNIQUE INDEX cms_users_username_uniq (username), PRIMARY KEY(id)) ENGINE = InnoDB", $sql[1]); $this->assertEquals("CREATE TABLE cms_users_groups (user_id INT DEFAULT NULL, group_id INT DEFAULT NULL, PRIMARY KEY(user_id, group_id)) ENGINE = InnoDB", $sql[2]); $this->assertEquals("CREATE TABLE cms_phonenumbers (phonenumber VARCHAR(50) NOT NULL, user_id INT DEFAULT NULL, PRIMARY KEY(phonenumber)) ENGINE = InnoDB", $sql[3]); $this->assertEquals("ALTER TABLE cms_addresses ADD FOREIGN KEY (user_id) REFERENCES cms_users(id)", $sql[4]); diff --git a/tests/Doctrine/Tests/ORM/Tools/SchemaToolTest.php b/tests/Doctrine/Tests/ORM/Tools/SchemaToolTest.php new file mode 100644 index 000000000..af7225619 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Tools/SchemaToolTest.php @@ -0,0 +1,35 @@ +_getTestEntityManager(); + $schemaTool = new SchemaTool($em); + + $classes = array( + $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress'), + $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsArticle'), + $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsComment'), + $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsEmployee'), + $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsGroup'), + $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsPhonenumber'), + $em->getClassMetadata('Doctrine\Tests\Models\CMS\CmsUser'), + ); + + $schema = $schemaTool->getSchemaFromMetadata($classes); + + $this->assertTrue($schema->hasTable('cms_users')); + $this->assertTrue($schema->getTable('cms_users')->hasIndex('cms_users_username_uniq')); + $this->assertEquals( + array('username'), + array_map('strtolower', $schema->getTable('cms_users')->getIndex('cms_users_username_uniq')->getColumns()) + ); + } +} \ No newline at end of file