在 cakephp 模型中验证比较两个字段

ind*_*ago 2 php validation cakephp

我有一个模型 Interesttype,我想要验证两个字段,一个不应该多于另一个,并且没有一个应该小于特定的设置值。这是我的模型。

    class Interesttype extends AppModel
    {
      public $primaryKey = 'int_id';
      public $displayField = 'int_name';
      public $hasMany= array(
            'Loan' => array(
                'className' => 'Loan',
                'foreignKey' => 'lon_int_id'            
            )
        );
      public $validate = array(
            'int_name'=> array(
                    'rule' => 'notEmpty',
                    'allowEmpty' => false,
                    'message' => 'The interest type name is required.'
                    ),
          'int_active'=>array(
                     'rule'=>array('boolean'),
                     'allowEmpty'=>false,
                     'message'=>'Please select the status of this interest type'
                     ),
           'int_max'=> array(
                    'numeric'=>array(
                        'rule' => 'numeric',
                        'allowEmpty' => false,
                        'message' => 'Please specify a valid maximum interest rate.'
                        ),
                    'comparison'=>array(
                        'rule' => array('comparison','>',1000),
                        'allowEmpty' => false,
                        'message' => 'The Maximum interest rate cannot be less than the special rate.'
                        ),
                    'checklimits'=>array(
                        'rule' => array('checkRateLimits','int_min'),
                        'allowEmpty' => false,
                        'message' => 'The Maximum interest rate cannot be less than the minimum rate.'
                        )
                    ),
        'int_min'=> array(
                    'numeric'=>array(
                        'rule' => 'numeric',
                        'allowEmpty' => false,
                        'message' => 'Please specify a valid minimum interest rate.'
                        ),
                    'comparison'=>array(
                        'rule' => array('comparison','>',1000),
                        'allowEmpty' => false,
                        'message' => 'The Minimum interest rate cannot be less than the special rate.'
                        ))
        ); 
   function checkRateLimits($maxr,$minr){
           if($maxr>=$minr){
               return true;
           }
           else{
               return false;
           }
       }
    }
Run Code Online (Sandbox Code Playgroud)

上述模型很好地验证了我的表格,只是不会进行一次检查,它不会检查最高利率是否确实大于或等于最低利率。我在验证中哪里出错了?

bfn*_*ncs 5

您必须添加自己的验证方法才能实现这一点。这是一个非常通用的示例,它使用Validation::comparison()并支持其所有运算符(>, <, >=, <=, ==, !=, isgreater, isless, greaterorequal, lessorequal, equalto, notequal)作为选项数组中的第二个参数和一个字段名称来比较验证值作为第三个参数.

class MyModel extends AppModel
{

    /* Example usage of custom validation function */
    public $validate = array(
        'myfield' => array(
            'lessThanMyOtherField' => array(
                'rule' => array('comparisonWithField', '<', 'myotherfield'),
                'message' => 'Myfield value has to be lower then Myotherfield value.',
            ),
        ),
    );

    /* Custom validation function */
    public function comparisonWithField($validationFields = array(), $operator = null, $compareFieldName = '') {
        if (!isset($this->data[$this->name][$compareFieldName])) {
            throw new CakeException(sprintf(__('Can\'t compare to the non-existing field "%s" of model %s.'), $compareFieldName, $this->name));
        }
        $compareTo = $this->data[$this->name][$compareFieldName];
        foreach ($validationFields as $key => $value) {
            if (!Validation::comparison($value, $operator, $compareTo)) {
                return false;
            }
        }
        return true;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是通用的,所以AppModel如果你想在你的应用程序的多个模型中使用它,你可以在你的函数中抛出它。您也可以将其设为Behavior以在不同模型之间共享。