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

Validation cakephp:基于另一个字段的模型验证,validation,cakephp,model,Validation,Cakephp,Model,我试图在一个字段上设置模型验证,如果另一个字段等于某个特定值,则只需检查该字段 我的第一个字段是query,它是一个包含许多值的下拉列表,其中一个值是'Other',如果选中该字段,则我需要第二个字段'query_Other'不为空 我的项目模型中有此设置: public $validate = array( 'query' => array( 'notempty' => array( 'rule' => array('notemp

我试图在一个字段上设置模型验证,如果另一个字段等于某个特定值,则只需检查该字段

我的第一个字段是query,它是一个包含许多值的下拉列表,其中一个值是'Other',如果选中该字段,则我需要第二个字段'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是按值传递的,而不是按方法签名要求传递的。没有任何内容可以通过引用传递给自定义验证方法,因此只需删除
&
,分别从签名中删除第一个参数即可

传递给自定义验证方法的第一个参数始终是要验证的字段的数据(采用
key=>value
格式),然后是
规则
数组中定义的可能参数,例如字段名。因此,
$check
永远不会是
null
,除非您在
规则
数组中定义了
null
,即
'rule'=>数组('if\u query\u other',null)
,因此您的第三个参数永远不会是字段名

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

下面是一个示例,它检查传入的
$query\u field
字段是否存在,以及其值是否等于
Other
,如果存在,则返回当前字段的值是否为空(我假设内置的
验证::notEmpty()
足以满足“notEmpty”检查需要)。如果
$query\u字段
的值不等于
其他
,则此规则将始终成功验证,即不要求该值不为空

...

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;
    }
}

验证功能位于模型本身或行为中的何处?此外,您应该始终提到您的确切CakePHP版本!谢谢,验证在项目模型中,我使用的是cakePHp版本2.3.6。非常感谢,它似乎没有启动,但是我想知道我是否正确调用它(如上所述?)虽然我现在没有收到任何错误,但是如果字段为空,仍然会运行。我已经用您的确切验证规则对它进行了测试,它对我来说是正常工作的,如果
query
Other
query\u Other
为空,则抛出错误。再次阅读您的问题后,我注意到您提到了
其他
以及
其他
,因此请确保使用了正确的大小写比较值。除此之外,很难判断您的设置中可能有什么错误,您必须进行一些调试,检查是否实际调用了
,检查传递值的内容,检查
哈希::get
验证::notEmpty
的结果,等等…谢谢,我想知道我上面的$validate规则是否错误地调用了您的函数?不,这很好(《代码》查询的规则应该是
noEmpty
,大写字母
E
,但是,由于PHP中的方法不区分大小写,所以这不重要,如果可能的话会导致其他错误消息),正如我所说的,我已经使用了这些确切的规则,它是有效的:好的,非常感谢,一定是其他原因引起了问题。再次感谢你的帮助。