cakephp isUnique pour les 2 champs?
J'ai un formulaire d'inscription dans lequel les utilisateurs peuvent remplir deux adresse e-mail (email1 & email2). Le Marketing de l'exigence, c'est qu'ils ont besoin d'être unique (unique comme si on avait 10 utilisateurs, alors il n'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-il quelque chose de similaire à la isUnique fonctionnalité (unique dans un champ) qui peut faire de ce droit hors de la boîte? Ou suis-je condamné à code moi-même? Merci à l'avance.
EDIT: construit sur Richard exemple, 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);
}
Notez que des versions plus récentes de CakePHP2.x prise en charge d'un tableau de book.cakephp.org/2.0/en/models/... pour permettre à de multiples champs par défaut maintenant.
OriginalL'auteur jodeci | 2010-03-17
Vous devez vous connecter pour publier un commentaire.
J'ai posté une solution à ce sur le CakePHP Groupe Google groupes:
http://groups.google.com/group/cake-php/browse_frm/thread/b3a1e4ae3eeb6091/e168f54bac27c163?lnk=gst&q=checkUnique#e168f54bac27c163
Ajouter les éléments suivants à votre AppModel:
et est utilisé dans votre modèle de valider:
Le
if (isset($this->data[$this->name][$this->primaryKey])) { $tmp[$this->primaryKey] = "<>".$this->data[$this->name][$this- >primaryKey];
doit être supprimé, depuis Gâteau 2.x fait de cet vérifier par lui-même dans leisUnique
méthode. Pire, il fait le isUnique retour incorrect pour moi.OriginalL'auteur RichardAtHome
checkUnique
pourrait juste être écrit comme un wrapper pourisUnique
.et est utilisé dans votre modèle de valider:
Cette fonctionnalité n'est pas disponible dans CakePHP quand j'ai écrit ma réponse originale à cette question
L'a obtenu. Merci de me le dire @RichardAtHome
ce qui est sur modifier affaire.?? lorsque nous avons mis cette condition de contourner cette ligne.
OriginalL'auteur Kristof Neirynck
De cakePHP 2.0, documentation:
Vous pouvez valider qu'un ensemble de champs sont uniques en offrant de multiples domaines et de définir $ou faux:
Assurez-vous d'inclure le champ d'origine dans la liste des champs lors de la prise d'une règle unique à travers de multiples domaines.
Si un répertoriés champ n'est pas inclus dans le modèle de données, il est considéré comme une valeur null. Vous pouvez envisager de marquage de la liste de champs que nécessaire.
OriginalL'auteur Salim Hamidi
Oui et non.
Oui, vous avez le code vous-même, mais à l'intérieur de la CakePHP validation de la composante.
La validation de la composante a un mécanisme pour permettre les règles de validation personnalisée. Essentiellement, vous mettez le nom d'une fonction à l'intérieur de $validate (comme vous le feriez normalement). Vous n'avez qu'à définir la fonction; dans ce cas, c'est assez simple (juste appliquer votre double isUnique exigence).
http://book.cakephp.org/2.0/en/models/data-validation.html#custom-validation-rules
OriginalL'auteur Travis Leleu
Au risque d'être battu sur la tête et les épaules pour offrir un non-CakePHP solution, permettez-moi de présenter le suivant.
Créer un index unique dans votre base de données de plus de néanmoins de nombreuses colonnes dont vous avez besoin.
Standard SQL syntaxe est la suivante:
Place votre "$this->Model->save () de la commande" à l'intérieur d'un "try/catch" bloquer. Dans le "catch" bloc de test de l'exception pour le code d'erreur. MySQL, un unique de violation de clé est le code d'erreur 23000, mais vous devez être prêt pour les autres erreurs possibles.
C'est simple et rapide et ne nécessite pas de comptage de tableau entre parenthèses.
Vous devriez toujours place de la base de données code d'accès à l'intérieur d'un "try/catch" bloc de toute façon. Une partie de votre gestion des exceptions devraient inclure de journalisation des messages d'erreur inattendus. Vous ne pouvez pas vous attendre à CakePHP de faire tout pour vous.
OriginalL'auteur UncaAlby
Comme je me souviens bien, vous avez pour ce genre d'application à l'aide de la
beforeSave
méthode dans le modèle. J'ai eu une exigence qu'un objet ayant au moins une des N fks ensemble, et je ne pouvais que faire de cette façon.Edit: essayez ce fil pour voir s'il ya quelque chose de résoudre votre problème.
OriginalL'auteur Adriano Varoli Piazza