cakephp:基于另一个字段的模型验证

时间:2013-08-11 23:36:12

标签: validation cakephp model

我正在尝试在一个字段上设置模型验证,只需要检查另一个字段是否等于特定值。

我的第一个字段是查询,它是一个包含许多值的下拉列表,如果选中此项,则一个值为“其他”,然后我需要第二个字段“query_other”不为空。

我在项目模型中有这个设置:

public $validate = array(
   'query' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            'message' => 'THE QUERY IS REQUIRED',
            //'allowEmpty' => false,
            //'required' => false,
            //'last' => false, // Stop validation after this rule
            //'on' => 'create', // Limit validation to 'create' or 'update' operations
        ),
    ),
    'query_other' => array(
        'notempty' => array(
            'rule' => array('if_query_other', 'query'),
            'message' => 'REASON IS REQUIRED',
            //'allowEmpty' => false,
            //'required' => false,
            //'last' => false, // Stop validation after this rule
            //'on' => 'create', // Limit validation to 'create' or 'update' operations
        ),
    ),
);

然后我有了上面调用的自定义函数。

 function if_query_other(&$data, $check, $query_field) {

    if($this->data[$this->name][$query_field] == 'Other' && $check == NULL)
    {
        return false;
    }
    else
    {
        return true;
    }
  }

它无效,我目前收到此错误:参数1到Item :: if_query_other()应该是参考,给定值

CakePHP版本2.3.6

由于

1 个答案:

答案 0 :(得分:2)

错误消息非常清楚,参数1按值传递,而不是by reference,因为您的方法签名需要。通过引用自定义验证方法无需传递任何内容,因此只需删除&,分别从签名中删除第一个参数。

传递给自定义验证方法的第一个参数将始终是要验证的字段的数据(以key => value格式),然后是rule数组中定义的可能参数,例如您的字段名。所以$check从来都不是null,除非您在null数组中定义rule,即'rule' => array('if_query_other', null),因此您的第三个参数将永远不会是rule字段名。

长话短说,您只需要定义两个参数,第一个将包含要验证的字段的数据,第二个将包含$query_field数组中定义的附加值。

这是一个例子,它检查Other中传递的字段是否存在以及它的值是否等于Validation::notEmpty(),如果是,则返回当前字段的值是否为空(我是假设内置$query_field足以满足您的“非空”检查需求。如果Other字段的值不等于... App::uses('Hash', 'Utility'); App::uses('Validation', 'Utility'); class Item extends AppModel { ... public function if_query_other($check, $query_field) { if(Hash::get($this->data[$this->alias], $query_field) === 'Other') { return Validation::notEmpty(current($check)); } return true; } } ,则此规则将始终成功验证,即该值不需要为空。

{{1}}