关于php:如何验证cakephp中相同字段的多个条目

how to validate multiple entries for same field in cakephp

是否有任何机构可以知道如何验证同一领域的多个条目。 我需要验证并将数据保存到DB表。 我尝试使用通常用于验证数据的验证规则方法,但验证函数返回1,即True而不是错误。 此外,我在一个额外的数组窃取中附加了验证规则它无法正常工作。

请指导我验证多个条目的数据。

控制器代码

1
2
3
4
5
6
$this->MyModel->set($this->request->data);
if($this->MyModel->validates()){
   //Some code
}else{
   pr($this->MyModel->validationErrors);
}

提交表格的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Array
(
    [MyModel] => Array
        (
            [0] => Array
                (
                    [qualification_id] =>
                    [stream] =>
                    [pass_year] =>
                    [description] =>
                    [resume_id] => 1
                )
            [1] => Array
                (
                    [qualification_id] =>
                    [stream] =>
                    [pass_year] =>
                    [description] =>
                    [resume_id] => 1
                )

        )

)

MyModel验证规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public $validate = array(
        array(
            'resume_id' => array(
            'notEmpty'=>array(
                'rule' => 'notEmpty',
                'message' => 'Invalid resume reference.'
            ),
            'numeric' => array(
                'rule' => 'numeric',
                'message' => 'Invalid resume reference.'
            )
        ),
        'qualification_id' => array(
            'notEmpty'=>array(
                'rule' => 'notEmpty',
                'message' => 'Please enter qualification.'
            ),
            'numeric' => array(
                'rule' => 'numeric',
                'message' => 'Invalide qualification selected'
            )
        )
        )
    );

谢谢,

帕拉格C.


Model::validates()只能处理之前使用Model::set()设置的单个记录。

如果要验证多个记录,则必须使用Model::validateMany()

它可以实现为:

1
2
3
4
5
6
$data = $this->request->data; //to prevent $this->request->data from being altered.
if($validationErrors=$this->MyModel->validateMany($data)){
    //Some code
}else{
    pr($validationErrors);
}

请参阅CakePHP 2.x API中的Model::validateMany()


我找到了解决方案,因为Inigo Flores说Model::validateMany()是完全帮助,但在我的情况下Model::validateMany()不起作用。 所以我在我的模型中覆盖了该方法

型号代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public function validateMany(&$data, $options = array()) {
        $validationErrors = array();
        foreach ($data[$this->alias] as $key => $values) {
            $this->set($values);
            if (!$this->validates($values)) {                
                $validationErrors[$this->alias][$key] = $this->validationErrors;                
                foreach ($this->validationErrors as $field => $msg) {
                    $validationErrors[$this->alias][$key][$field]['message'] = $msg[0];
                }
            }
        }
        if (!empty($validationErrors)) {
            unset($this->validationErrors);
            $this->validationErrors = $validationErrors;
            return false;
        } else {
            return true;
        }
    }

我使用cakephp的$this->validates()方法来验证每个数组

每个表单字段的CTP代码:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$isError = false;
if (!empty($errors['MyModel'][$index]['qualification_id']['message'])) {
    $isError = true;
}
?>
">
    <?php
    echo $this->Form->label(_('Qualification'));
    echo $this->Form->select('MyModel.' . $index . '.qualification_id', $qualifications, array('div' => false, 'required' => false, 'empty' => 'Please select', 'class' => 'form-control', 'maxlength' => 80));
    echo ($isError) ? '<span>' . $errors['MyModel'][$index]['qualification_id']['message'] . '</span>' : '';
    ?>

这是一个有点长的过程,但它解决了我的验证问题。

谢谢,
帕拉格C.