From 18766e657969c5c59837faa3731f06eb6ebe7319 Mon Sep 17 00:00:00 2001 From: romanb Date: Thu, 12 Apr 2007 08:38:59 +0000 Subject: [PATCH] Fixed an issue with the unique validator. --- lib/Doctrine/Validator/Unique.php | 111 ++++++++++++++++-------------- tests/ValidatorTestCase.php | 5 +- tests/classes.php | 2 +- 3 files changed, 64 insertions(+), 54 deletions(-) diff --git a/lib/Doctrine/Validator/Unique.php b/lib/Doctrine/Validator/Unique.php index f5748c5db..e0babf77e 100644 --- a/lib/Doctrine/Validator/Unique.php +++ b/lib/Doctrine/Validator/Unique.php @@ -1,51 +1,60 @@ -. - */ - -/** - * Doctrine_Validator_Unique - * - * @package Doctrine - * @category Object Relational Mapping - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.phpdoctrine.com - * @since 1.0 - * @version $Revision$ - * @author Konsta Vesterinen - */ -class Doctrine_Validator_Unique -{ - /** - * @param Doctrine_Record $record - * @param string $key - * @param mixed $value - * @param string $args - * @return boolean - */ - public function validate(Doctrine_Record $record, $key, $value, $args) - { - $table = $record->getTable(); - $sql = 'SELECT ' . $table->getIdentifier() . ' FROM ' . $table->getTableName() . ' WHERE ' . $key . ' = ?'; - $stmt = $table->getConnection()->getDbh()->prepare($sql); - $stmt->execute(array($value)); - - return ( ! is_array($stmt->fetch())); - } -} +. + */ + +/** + * Doctrine_Validator_Unique + * + * @package Doctrine + * @category Object Relational Mapping + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision$ + * @author Konsta Vesterinen + */ +class Doctrine_Validator_Unique +{ + /** + * @param Doctrine_Record $record + * @param string $key + * @param mixed $value + * @param string $args + * @return boolean + */ + public function validate(Doctrine_Record $record, $key, $value, $args) + { + $table = $record->getTable(); + $sql = 'SELECT ' . $table->getIdentifier() . ' FROM ' . $table->getTableName() . ' WHERE ' . $key . ' = ?'; + + $values = array(); + $values[] = $value; + + foreach ($table->getPrimaryKeys() as $pk) { + $sql .= " AND {$pk} != ?"; + $values[] = $record->$pk; + } + + $stmt = $table->getConnection()->getDbh()->prepare($sql); + $stmt->execute($values); + + return ( ! is_array($stmt->fetch())); + } +} diff --git a/tests/ValidatorTestCase.php b/tests/ValidatorTestCase.php index 813cffe0f..f79e977d0 100644 --- a/tests/ValidatorTestCase.php +++ b/tests/ValidatorTestCase.php @@ -338,16 +338,17 @@ class Doctrine_Validator_TestCase extends Doctrine_UnitTestCase { $this->manager->setAttribute(Doctrine::ATTR_VLD, true); $r = new ValidatorTest_Person(); - $r->name = 'value'; + $r->identifier = '1234'; $r->save(); $r = $this->connection->getTable('ValidatorTest_Person')->findAll()->getFirst(); - $r->name = 'value'; + $r->identifier = 1234; try { $r->save(); } catch(Doctrine_Validator_Exception $e) { $this->fail("Validator exception raised without reason!"); + var_dump($r->getErrorStack()); } $this->manager->setAttribute(Doctrine::ATTR_VLD, false); diff --git a/tests/classes.php b/tests/classes.php index 505662c83..fa7a6ad00 100644 --- a/tests/classes.php +++ b/tests/classes.php @@ -606,7 +606,7 @@ class NestReference extends Doctrine_Record class ValidatorTest_Person extends Doctrine_Record { public function setTableDefinition() { - $this->hasColumn('name', 'string', 255, array('notblank', 'unique')); + $this->hasColumn('identifier', 'integer', 4, array('notblank', 'unique')); $this->hasColumn('is_football_player', 'boolean'); }