2010-08-10 4 views
6

Je suis sûr que je ne suis pas le premier à avoir des clés composites uniques dans les tableaux et qui veut les valider. Je ne veux pas inventer le vélo alors je demande d'abord ici. J'ai plusieurs tables qui ont des colonnes 'id' comme clés primaires et deux autres colonnes comme des clés composites uniques. Il serait bon d'avoir une règle de validation pour vérifier que l'entrée soumise est unique et afficher une erreur de validation si ce n'est pas le cas. Dans Cakephp, cela pourrait être fait par une règle de validation personnalisée. Je suis assez sûr que quelqu'un a déjà créé une telle méthode.Règle de validation pour un index composite unique (non primaire)

Idéalement, ce serait une méthode dans app_model.php qui pourrait être utilisée par différents modèles.

Répondre

11

J'utilise cette fonction:

function checkUnique($data, $fields) { 
    if (!is_array($fields)) { 
      $fields = array($fields); 
     } 
     foreach($fields as $key) { 
      $tmp[$key] = $this->data[$this->name][$key]; 
     } 
    if (isset($this->data[$this->name][$this->primaryKey]) && $this->data[$this->name][$this->primaryKey] > 0) { 
      $tmp[$this->primaryKey." !="] = $this->data[$this->name][$this->primaryKey]; 
     } 
    //return false; 
     return $this->isUnique($tmp, false); 
    } 

essentiellement l'utilisation est:

'field1' => array(
       'checkUnique' => array(
        'rule' => array('checkUnique', array('field1', 'field2')), 
        'message' => 'This field need to be non-empty and the row need to be unique' 
       ), 
      ), 
'field2' => array(
       'checkUnique' => array(
        'rule' => array('checkUnique', array('field1', 'field2')), 
        'message' => 'This field need to be non-empty and the row need to be unique' 
       ), 
      ), 

Donc, fondamentalement, cela montrera l'avertissement dans chacun des champs en disant que ce n'est pas unique. Je l'utilise beaucoup et ça fonctionne correctement.

+0

Merci! C'est exactement ce que je voulais. Le seul point de sortie est qu'il produit 2 requêtes identiques lorsque 2 champs sont validés. – bancer

-1

Vous pouvez le mettre dans le modèle de l'application, mais ma suggestion serait simplement de l'ajouter directement au modèle en plaçant la règle avec sa propriété $validate.

Consultez la version intégrée isUnique rule.

+0

'isUnique' valide un seul champ pour une seule colonne. J'ai besoin de la règle de validation pour deux colonnes qui composent la clé unique composite. – bancer

+0

Je vois. Pardon. Alors oui, si c'est quelque chose dans plusieurs modèles, je construirais une règle de validation personnalisée et la mettrais dans app_model.php. –

0

Dans les versions CakePHP/2.x publiées au cours des dernières années, the isUnique rule accepte en option plusieurs colonnes:

Vous pouvez confirmer qu'un ensemble de champs sont uniques en leur fournissant plusieurs champs et définissez $or à false:

public $validate = array(
    'email' => array(
     'rule' => array('isUnique', array('email', 'username'), false), 
     'message' => 'This username & email combination has already been used.' 
    ) 
); 

Je ne suis pas sûr de la version exacte lorsque la fonction était disponible mais il y a a bug fixé dans core aussi tard que Octobre 2014 déposé contre 2.3 et 2.4 branches.

Questions connexes