2012-06-23 3 views
3

У меня есть пара столбцов (ip, provider_id), для которых я хочу, чтобы комбинации значений всегда были уникальными. Поэтому я пытаюсь создать пользовательскую функцию проверки. Но у меня возникают проблемы, связанные с ценностью вторичного поля. Это мой код до сих пор в модели:CakePHP 2.1 - Пользовательское правило проверки - проверка уникальной комбинации полей

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; 

} 

Таким образом, проблема в том, что, когда я тестирую то, что значение загружается в $ поле, это просто «provider_id», строку. Я надеялся, что он будет содержать значение поля «provider_id». Кто-нибудь знает, как захватить это значение (и все другие значения полей вторичной модели, если это необходимо) и отправить его в пользовательскую функцию проверки?

Мое чтение в CookBook и люди, которые обсуждали подобные проблемы, похоже, предлагали это решение работать, но не для меня, к сожалению.

Заранее благодарен!

ответ

5

Торт определенно ведет себя так, как предполагается, там. Второй парамаметр, который вы передаете в этом массиве «rule», должен быть передан как статическое значение.

Однако ваш provider_id должны быть доступны в $ this-> данные [ '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; 

} 

Надеюсь, что это поможет!

+0

Большое спасибо! Очень признателен! – alieninlondon

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', 
    ), 
), 
+0

Спасибо, но как это работает? Учитывая, что массив ('user_id') передается как статическое значение для ответа от joshua.paling, как я могу пройти в таких полях, как поле user_id, которое у вас есть? Кроме того, я немного незнакомый с синтаксисом выше, почему вы добавляете массив «validate» => (-line? И делает ли это материал между: public $ validate = array (** здесь ваши данные **);? – alieninlondon

+0

вы можете легко передать идентификатор провайдера в вашем массиве данных: '$ this-> data ['ModelName'] ['provider_id']' должно содержать значение, и все это работает из коробки. – mark

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; 

} 
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-> данные [$ this-> псевдоним] [ 'provider_id'] автоматически получает значение provider_id.

Смежные вопросы