CakePHP 2.1 - Aangepaste validatieregel - controleren op unieke veldwaardecombinatie

Ik heb een aantal kolommen (ip, provider_id) waarvoor ik wil dat combinaties van waarden altijd uniek zijn. Daarom probeer ik een aangepaste validatiefunctie te maken. Maar ik heb problemen met het betrekken van de waarde van het secundaire veld. Dit is mijn code tot nu toe in het model:

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;

}

Het probleem is dus dat wanneer ik test welke waarde in $ field wordt geladen, dit gewoon 'provider_id' is, een tekenreeks. Ik hoopte dat het de waarde van het veld 'provider_id' zou bevatten. Weet iemand hoe hij die waarde (en alle andere veldwaarden van het secundaire model indien nodig) moet grijpen en naar de aangepaste validatiefunctie kan sturen?

Mijn lezing in de CookBook en mensen die soortgelijke problemen hebben besproken, leken te suggereren dat deze oplossing zou werken, maar helaas niet voor mij.

Bij voorbaat dank!

3

4 antwoord

Cake gedraagt ​​zich zeker zoals het hoort. De tweede paramameter die u in die array 'rule' doorgeeft, moet als een statische waarde worden doorgegeven.

However, your provider_id should be available in $this->data['MyModel']['provider_id']

Dus je zou die tweede parameter volledig moeten kunnen vergeten, en doen:

public function uniqueClick ($ip) {

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

}

Ik hoop dat het helpt!

5
toegevoegd
Hartelijk bedankt! Zeer gewaardeerd!
toegevoegd de auteur alieninlondon, de bron

Om het antwoord van Joshua aan te vullen, zou de validatiereeks als volgt moeten worden opgebouwd:

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

}
2
toegevoegd

je kunt ook mijn regel gebruiken en kan met zoveel velden werken als je nodig hebt

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

dus eigenlijk hetzelfde als je probeerde:

'ip' => array(
    'validateUnique' => array(
        'rule' => array('validateUnique', array('provider_id')),
        'message' => 'You already have an entry',
    ),
),
0
toegevoegd
je kunt eenvoudig de provider id in je datarray doorgeven: $ this-> data ['ModelName'] ['provider_id'] zou de waarde moeten bevatten en dan alles uit de doos werken.
toegevoegd de auteur mark, de bron
Bedankt, maar hoe werkt deze? Gegeven de array ('user_id') wordt doorgegeven als een statische waarde per antwoord van joshua.paling, hoe kan ik passen in velden zoals het veld user_id dat je hebt? Ook ben ik een beetje onbekend met de syntaxis hierboven, waarom voeg je de 'validate' => array toe (-line? En gaat dit tussen: public $ validate = array ( dit zijn jouw dingen );?
toegevoegd de auteur alieninlondon, de bron

U kunt deze oplossing direct gebruiken zonder iets door te geven in validatieregels behalve de unieke functie op maat.

// 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'] automatically gets the value of the provider_id.

0
toegevoegd