3

値の組み合わせを常に一意にする列がいくつかあります(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での私の読書と同様の問題について議論した人々は、この解決策がうまくいくことを示唆しているように見えましたが、残念ながら私にとってはそうではありませんでした。

前もって感謝します!

4

4 に答える 4

5

Cake は間違いなく、本来あるべき方法で動作しています。その「ルール」配列で渡す 2 番目のパラメーターは、静的な値として渡されることを意図しています。

ただし、あなたの provider_id は $this->data['MyModel']['provider_id'] で利用できるはずです

したがって、その 2 番目のパラメーターを完全に忘れて、次のように実行できるはずです。

public function uniqueClick ($ip) {

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

}

それが役立つことを願っています!

于 2012-06-24T00:00:59.630 に答える
2

ジョシュアの答えを補完するには、検証配列を次のように構築する必要があります。

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

}
于 2012-12-12T04:58:33.050 に答える
0

私のルールを使用して、必要な数のフィールドを操作することもできます

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',
    ),
),
于 2012-06-24T06:17:16.313 に答える
0

カスタムの一意の関数を除いて、検証ルールに何も渡さずに、このソリューションを直接使用できます。

// 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 の値を取得します。

于 2014-02-03T09:19:04.060 に答える