【问题标题】:How to exclude a perticular field from unique validation in edit mode in cakephp3.0 validation如何在 cakephp 3.0 验证中以编辑模式从唯一验证中排除特定字段
【发布时间】:2017-05-24 11:53:18
【问题描述】:

我想验证一个名为 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;

这段代码有什么问题吗?

提前致谢。 `

【问题讨论】:

  • 我的用例是如果用户编辑其他详细信息但不更改survey_id?好吧,这验证失败,因为它不是唯一的! survey_id 存在于数据库中,它属于试图更改其个人资料其他方面的用户。我们该如何处理呢?或者如果用户更改并提供其他一些survey_id,它应该检查除当前survey_id之外的唯一性检查
  • 您需要创建自定义验证方法才能完成此操作。请参考此book.cakephp.org/3.0/en/core-libraries/… 请同时检查您的表/模型中的 buildRules()。
  • 嗨 justrohu 我尝试创建自定义验证,但是如何传递表的当前 id 以便将其从当前上下文中排除 $validator ->add('survey_id', 'custom' , [ 'rule' => function ($value, $id) use ($id) { $data = $this->getSurveyId($value, array($id)); return (!empty($data)) ? false : true; }, 'message' => '标题无效' ]);那么如何在这种情况下获取 $id
  • 对于编辑,表的当前 id 存在于 $context / request 数据中。

标签: validation cakephp-3.0


【解决方案1】:

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

$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');
      }

【讨论】:

  • 比创建匿名函数和公共方法更好的是只创建方法。在我看来,它会更具可读性:->add('survey_id', 'custom', [$this, 'validateSurveyId']) 并将所有逻辑都放在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2014-06-14
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多