【问题标题】:CakePHP 2.1 - Custom Validation Rule - Check for Unique Field Value CombinationCakePHP 2.1 - 自定义验证规则 - 检查唯一字段值组合
【发布时间】:2012-06-23 23:30:44
【问题描述】:

我有几列(ip、provider_id),我希望值的组合始终是唯一的。因此,我正在尝试构建一个自定义验证功能。但是我在获取辅助字段的值时遇到了问题。到目前为止,这是我在模型中的代码:

public $validate = array(
   'ip' => array(
      'rule' => array('uniqueClick', 'provider_id'),
      'message' => 'The click is not unique.'
    )
);  

public function uniqueClick ($ip, $field) {

   $count = $this->find('count', array('conditions' => array('ip' => $ip, 'provider_id' => $field)));
   // echo $field;
   return $count == 0;

}

所以问题是,当我测试加载到 $field 中的值时,它只是“provider_id”,一个字符串。我希望它包含“provider_id”字段的值。有谁知道如何获取该值(以及所有其他辅助模型字段值,如有必要)并将其发送到自定义验证功能?

我在 CookBook 中的阅读和讨论过类似问题的人似乎表明这种解决方案可行,但不幸的是不适用于我。

提前致谢!

【问题讨论】:

    标签: validation cakephp unique cakephp-2.0 customvalidator


    【解决方案1】:

    Cake 的表现绝对是它应有的样子。您在该“规则”数组中传递的第二个参数旨在作为静态值传递。

    但是,您的 provider_id 应该在 $this->data['MyModel']['provider_id']

    中可用

    所以你应该能够完全忘记第二个参数,然后这样做:

    public function uniqueClick ($ip) {
    
       $count = $this->find('count', array(
          'conditions' => array(
              'ip' => $ip, 
              'provider_id' => $this->data[$this->alias]['provider_id'])
       ));
       return $count == 0;
    
    }
    

    希望有帮助!

    【讨论】:

    • 非常感谢!非常感谢!
    【解决方案2】:

    为了补充 Joshua 的回答,验证数组应该这样构建:

    // Validation rules
    public $validate = array(
       'ip' => array(
          'rule' => array('uniqueClick', 'ip'),
          'message' => 'The click is not unique.'
        )
    );  
    /** 
     * Checks if there are records on the datasource with the same ip and same provider_id
     * 
     */ 
    public function uniqueClick ($ip) {
       $count = $this->find('count', array(
          'conditions' => array(
              'ip' => $ip, 
              'provider_id' => $this->data[$this->alias]['provider_id'])
       ));
       return $count == 0;
    
    }
    

    【讨论】:

      【解决方案3】:

      您也可以使用我的规则来处理您需要的任意数量的字段

      试试http://www.dereuromark.de/2011/10/07/maximum-power-for-your-validation-rules/https://github.com/dereuromark/tools/blob/master/Model/MyModel.php#L930

      基本上和你尝试的一样:

      'ip' => array(
          'validateUnique' => array(
              'rule' => array('validateUnique', array('provider_id')),
              'message' => 'You already have an entry',
          ),
      ),
      

      【讨论】:

      • 谢谢,但是这个是如何工作的?鉴于根据 joshua.paling 的答案,数组('user_id')作为静态值传递,我怎样才能传入像你拥有的 user_id 字段这样的字段?另外我对上面的语法有点不熟悉,为什么要添加 'validate' => array( -line?这些东西是否介于两者之间: public $validate = array (here's your stuff ); ?
      • 您可以轻松地在数据数组中传递提供者 ID:$this->data['ModelName']['provider_id'] 应该包含该值,并且所有这些都可以开箱即用。
      【解决方案4】:

      您可以直接使用此解决方案,而无需在验证规则中传递任何内容,除了自定义唯一函数。

      // Validation rules
      public $validate = array(
          'ip' => array(
              'rule' => array('uniqueClick'),
             'message' => 'The click is not unique.'
          )
      );  
      /** 
       * Checks if there are records on the datasource with the same ip and same provider_id
       * 
       */ 
      public function uniqueClick ($ip) {
         $count = $this->find('count', array(
            'conditions' => array(
                'ip' => $ip, 
                'provider_id' => $this->data[$this->alias]['provider_id'])
         ));
         return $count == 0;
      
      }
      

      $this->data[$this->alias]['provider_id'] 自动获取provider_id的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 1970-01-01
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        • 1970-01-01
        相关资源
        最近更新 更多