如何在cakephp3.0验证中从编辑模式中的唯一验证中排除特定字段

时间:2017-01-10 04:41:51

标签: validation cakephp-3.0

我想验证名为survey_id的字段,该字段是用户对唯一性的输入。它正常工作并在添加新记录时给出正确的响应,但是当我尝试编辑此记录时,它给出了错误[unique] => Provided value already exist。所以我想要的是从唯一性检查中排除当前记录的survey_id,如果用户输入survey_id的其他值,则应检查唯一性搜索。

目前我正在使用CakePHP 3.0验证进行创建验证。这是我正在使用的验证规则:

validator
        ->requirePresence('survey_id', __('msg_required'))
        ->notEmpty('survey_id', __('msg_required'))
        ->maxlength('survey_id', 32, __('msg_maxlength'))    
        ->add('survey_id', 'unique', ['rule' =>   ['validateUnique',['id']], 'provider' => 'table', 'message' => 'Provided value already exist', 'on'=>'create']);

return $validator;

这段代码有什么问题吗?

提前致谢。    `

1 个答案:

答案 0 :(得分:0)

它将与此验证规则一起使用

$validator
        ->requirePresence('survey_id', __('msg_required'))
        ->notEmpty('survey_id', __('msg_required'))
        ->maxlength('survey_id', 32, __('msg_maxlength'))
        ->alphaNumeric('survey_id', __('msg_surveyid_format'))
        ->add('survey_id', 'custom', [
            'rule' => function ($value, $context) {
              if (!empty($context['data']['projectId'])) { $values = array($context['data']['projectId']); } else { $values = array(); }
              $data = $this->getSurveyId($value, $values);
              return (!empty($data)) ? false : true;
            },
              'message' => __('msg_surveyid_exsist')]);

        return $validator;
      }

public function getSurveyId($surveyId = null, $exclude = null) {

        $where = array('p.survey_id' => $surveyId);
        if (!empty($exclude) && is_array($exclude)) {
          $where[] = array('p.id NOT IN' => $exclude);
        }
        return $this->db->newQuery()
                        ->select('*')
                        ->from(['p' => 'projects'])
                        ->where($where)
                        ->execute()
                        ->fetch('assoc');
      }