验证数据库的某个字段是否已经存在了相同的数据
首先,在lib目录建立一个 sfCustomUniqueValidator.php
- <?php
- /**
- * sfCustomUniqueValidator checks if a record exist in the database with all the mentionned fields.
- *
- * ex: Check if a companie with company_name exist in country_id
- * class: sfCustomUniqueValidator
- * param:
- * class: Companies //the class on which the search is performed
- * nb_fields: 2 //the number of fields on which the comparison is done
- * field_1: company_name //First field of the comparison
- * field_2: country_id //Other country for the comparison
- *
- * @package lib
- * @author Joachim Martin
- * @date 15/06/2007
- */
- class sfCustomUniqueValidator extends sfValidator {
- /**
- * Executes this validator.
- *
- * @param mixed A file or parameter value/array
- * @param error An error message reference
- *
- * @return bool true, if this validator executes successfully, otherwise false
- */
- public function execute(&$value, &$error) {
- $className = $this->getParameter('class').'Peer';
- //Get fields number
- $nb_fields = $this->getParameter('nb_fields');
- //Define new criteria
- $c = new Criteria();
- //Loop on the fields
- for($i = 1; $i <= $nb_fields ; $i++) {
- //Retrieve field_$i
- $check_param = $this->getParameterHolder()->get("field_$i");
- $check_value = $this->getContext()->getRequest()->getParameter($check_param);
- //If check value defined
- if ($check_value != '') {
- //Adding field to the criteria
- $columnName = call_user_func(array($className, 'translateFieldName'), $check_param, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME);
- $c->add($columnName, $check_value);
- }
- }
- $object = call_user_func(array($className, 'doSelectOne'), $c);
- if ($object)
- {
- $tableMap = call_user_func(array($className, 'getTableMap'));
- foreach ($tableMap->getColumns() as $column)
- {
- if (!$column->isPrimaryKey())
- {
- continue;
- }
- $method = 'get'.$column->getPhpName();
- $primaryKey = call_user_func(array($className, 'translateFieldName'), $column->getPhpName(), BasePeer::TYPE_PHPNAME, BasePeer::TYPE_FIELDNAME);
- if ($object->$method() != $this->getContext()->getRequest()->getParameter($primaryKey))
- {
- $error = $this->getParameter('custom_unique_error');
- return false;
- }
- }
- }
- return true;
- }
- public function initialize ($context, $parameters = null) {
- // initialize parent
- parent::initialize($context);
- //Set default parameters value
- $this->setParameter('custom_unique_error','The value is not unique');
- $this->getParameterHolder()->add($parameters);
- // check parameters
- if (!$this->getParameter('class'))
- {
- throw new sfValidatorException('The "class" parameter is mandatory for the sfCustomUniqueValidator validator.');
- }
- if (!$this->getParameter('nb_fields'))
- {
- throw new sfValidatorException('The "nb_fields" parameter is mandatory for the sfCustomUniqueValidator validator.');
- }
- return true;
- }
- }
调用方法:
下面的代码检测companie表中是否已经有相同的记录
sfCustomUniqueValidator:
class: Companies
nb_fields: 3
field_1: company_name
field_2: activity_id
field_3: country_id
custom_unique_error: This company already exist for this country
class: 用来测试的model
nb_fields: 有几个字段要检测
field_x: 要检测的字段
custom_unique_error: 错误信息











发表留言