Question

J'ai un formulaire d'inscription dans lequel les utilisateurs peuvent remplir deux adresses e-mail (email1 & mail2). L'exigence de marketing est qu'ils doivent être uniques (unique comme si nous avions 10 utilisateurs, il y aurait 10 * 2 = 20 Adresse e-mail unique).

Le système est déjà construit sur CakePHP, donc ce que je voudrais savoir est, est-il quelque chose de similaire à la fonction isUnique (unique dans un champ) qui peut faire ce droit hors de la boîte? Ou suis-je condamné à coder moi-même? Merci à l'avance.

EDIT: construit sur l'exemple de Richard, cela a fonctionné pour moi:

function checkUnique($data, $fields) {
    if (!is_array($fields)) {
        $fields = array($fields);
    }
    foreach($data as $key) {
        $checks = $key;
    }
    if (empty($checks)) {
      return true;  //allow null
    }
    foreach($fields as $key) {
        $tmp[$key] = $checks;
    }
    if (isset($this->data[$this->name][$this->primaryKey])) {
        $tmp[$this->primaryKey] = "<>".$this->data[$this->name][$this->primaryKey];
    }
    return $this->isUnique($tmp);
}
Était-ce utile?

La solution

J'ai posté une solution à ce groupe sur le CakePHP Google:

http: // groups.google.com/group/cake-php/browse_frm/thread/b3a1e4ae3eeb6091/e168f54bac27c163?lnk=gst&q=checkUnique#e168f54bac27c163

Ajoutez ce qui suit à votre AppModel:

        /** 
         * checks is the field value is unqiue in the table 
         * note: we are overriding the default cakephp isUnique test as the 
original appears to be broken 
         * 
         * @param string $data Unused ($this->data is used instead) 
         * @param mnixed $fields field name (or array of field names) to 
validate 
         * @return boolean true if combination of fields is unique 
         */ 
        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])) { 
                        $tmp[$this->primaryKey] = "<>".$this->data[$this->name][$this- 
>primaryKey]; 

                } 
                return $this->isUnique($tmp, false); 
        } 
} 

et est utilisé dans votre validate modèle:

        var $validate = array( 
                "name"=>array( 
                        "unique"=>array( 
                                "rule"=>array("checkUnique", array("name", "institution_id")), 
                                "message"=>"A contact with that name already exists for that 
institution" 
                        ) 
                ) 
       ); 

Autres conseils

checkUnique pourrait juste être écrit comme une enveloppe pour isUnique.

class AppModel extends Model {
    public function checkUnique($ignoredData, $fields, $or = true) {
        return $this->isUnique($fields, $or);
    }
}

et est utilisé dans votre validate modèle:

public $validate = array(
    'name' => array(
        'unique' => array(
            'rule' => array('checkUnique', array('name', 'institution_id'), false), 
            'message' => 'A contact with that name already exists for that 
institution'
        )
    )
);

De la documentation CakePHP 2.0:

Vous pouvez confirmer qu'un ensemble de champs sont uniques en fournissant de multiples champs et définissez $ ou false:

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

Assurez-vous d'inclure le champ d'origine dans la liste des champs lors d'une règle unique dans plusieurs champs.

Si un champ répertorié ne figure pas dans les données du modèle, il est considéré comme une valeur nulle. Vous pouvez envisager de marquer les champs répertoriés au besoin.

Oui et non.

Oui, vous devrez le code vous-même, mais dans le composant de validation CakePHP.

Le composant de validation a un mécanisme pour permettre des règles de validation personnalisée. Essentiellement, vous mettez un nom de fonction à l'intérieur $ validate (comme vous le feriez normalement). Vous ne devez définir la fonction; dans ce cas, il est assez simple (appliquer simplement votre exigence de double isUnique).

http: //book.cakephp .org / 2.0 / fr / modèles / data-validation.html # règles de validation personnalisées -

Au risque d'être frappé à la tête et les épaules pour offrir une non CakePHP solution, laissez-moi vous présenter ce qui suit.

Créer un index unique dans votre base de données sur plusieurs colonnes mais dont vous avez besoin.

syntaxe SQL standard pour cela est:

create unique index {IndexName} on {Table} ({Column}, {Column}, ...)

Placez votre commande "$ this-> Model-> save ()" à l'intérieur d'un bloc "try / catch". Dans le bloc « catch », testez l'exception du code d'erreur. En MySQL, une violation de clé unique est le code d'erreur 23000, mais vous devez être prêt pour d'autres erreurs possibles.

Il est rapide et simple et ne comporte pas de comptage entre parenthèses du tableau.

Vous devez toujours code d'accès de base de données de place à l'intérieur d'un "try / catch" bloc de toute façon. Une partie de votre gestion des exceptions devrait inclure la journalisation des messages d'erreur inattendus. Vous ne pouvez pas attendre CakePHP faire tout pour vous.

Pour autant que je me rappelle, vous avez à ce type d'application en utilisant la méthode de beforeSave dans le modèle. J'ai eu une exigence qu'un objet ait au moins un ensemble N FKS, et je ne pouvais le faire de cette façon.

Edit: essayez ce fil pour voir si quelque chose là-bas permet de résoudre votre problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top