Frage

Ich habe ein Anmeldeformular, in dem Benutzer in zwei E-Mail-Adresse hinzufügen kann (email1 & EMAIL2). Marketing Anforderung ist, dass sie müssen eindeutig sein (einzigartig wie in, wenn wir 10 Benutzer haben, dann würde es 10 * 2 = 20 eindeutige E-Mail-Adresse sein).

Das System ist bereits auf CakePHP gebaut, so was würde ich gerne wissen, es ist etwas ähnlich das isUnique Merkmal (einzigartig in einem Feld), die dieses Recht aus dem Kasten heraus tun können? Oder bin ich dazu verdammt, dies selbst zu codieren? Vielen Dank im Voraus.

EDIT: gebaut auf Richards Beispiel, das ist für mich gearbeitet:

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);
}
War es hilfreich?

Lösung

gab ich eine Lösung dieses Problem auf der CakePHP Google-Gruppe:

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

Fügen Sie folgendes zu Ihrem 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); 
        } 
} 

und wird in Ihrem Modell Validate verwendet:

        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" 
                        ) 
                ) 
       ); 

Andere Tipps

checkUnique konnte nur als Wrapper für isUnique geschrieben werden.

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

und wird in Ihrem Modell Validate verwendet:

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'
        )
    )
);

Von CakePHP 2.0-Dokumentation:

Sie können bestätigen, dass eine Reihe von Feldern eindeutig sind durch mehrere Felder bereitstellt und $ oder auf false gesetzt:

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

Stellen Sie sicher, dass das ursprüngliche Feld in der Liste der Felder zu schließen, wenn eine eindeutige Regel über mehrere Felder zu machen.

Wenn ein börsennotiertes Feld ist in den Modelldaten nicht enthält, dann ist es als Nullwert behandelt. Sie können prüfen, die aufgeführten Felder nach Bedarf markieren.

Ja und nein.

Ja, Sie Code haben Sie es selbst, aber innerhalb der CakePHP Validierungskomponente.

Die Validierungskomponente verfügt über einen Mechanismus benutzerdefinierte Validierungsregeln zu ermöglichen. Im Wesentlichen Sie in $ Validate einen Funktionsnamen setzen (wie gewohnt). Sie haben die Funktion zu definieren; in diesem Fall ist es ziemlich einfach (nur Ihre Doppel isUnique Anforderung erzwingen).

http: //book.cakephp .org / 2.0 / de / models / Daten-validation.html # custom-Validierung-Regeln

Auf die Gefahr über den Kopf geschlagen und Schultern für das Angebot ein nicht-CakePHP Lösung, lassen Sie mich folgendes vor.

Erstellen Sie einen eindeutigen Index in der Datenbank über wie viele Spalten, die Sie benötigen.

Standard-SQL-Syntax hierfür lautet:

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

Zeigen Sie mit "$ this-> Model-> save ()" Befehl in einer "try / catch" -Block. In dem „catch“ -Block, testen Sie die Ausnahme für den Fehlercode. In MySQL, eine eindeutigen Schlüssel Verletzung Fehlercode 23000, aber Sie sollten für andere mögliche Fehler auch vorbereitet werden.

Es ist schnell und einfach und beinhaltet nicht das Zählen Array Klammern.

sollten Sie immer Ort Datenbank Zugangscode in einem "try / catch" -Block trotzdem. Ein Teil Ihrer Ausnahmebehandlung Bedingungen sollten alle unerwarteten Fehlermeldungen zu protokollieren. Sie können nicht erwarten, dass CakePHP tun alles für Sie.

Soweit ich mich erinnere, haben Sie auf diese Art der Durchsetzung der beforeSave Methode im Modell. Ich hatte eine Anforderung, dass ein Objekt mindestens eine von N fks Satz, und ich konnte es auf diese Weise nur tun.

Edit: versuchen diesen Thread zu sehen, ob dort etwas löst Ihr Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top