2010-08-10 26 views
6

Ich bin mir sicher, dass ich nicht der erste bin, der zusammengesetzte eindeutige Schlüssel in Tabellen hat und diese validieren möchte. Ich möchte das Fahrrad nicht erfinden, also frage ich zuerst hier. Ich habe mehrere Tabellen, die ID-Spalten als Primärschlüssel und zwei weitere Spalten als eindeutige zusammengesetzte Schlüssel haben. Es wäre schön, eine Validierungsregel zu haben, um zu überprüfen, ob der übermittelte Eintrag eindeutig ist, und einen Validierungsfehler anzuzeigen, wenn dies nicht der Fall ist. In CakePHP könnte dies durch eine benutzerdefinierte Validierungsregel geschehen. Ich bin mir ziemlich sicher, dass jemand schon eine solche Methode erstellt hat.Validierungsregel für einen zusammengesetzten eindeutigen Index (nicht primär)

Idealerweise wäre es eine Methode in app_model.php, die von verschiedenen Modellen verwendet werden könnte.

Antwort

11

Ich benutze diese Funktion:

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

im Grunde die Nutzung ist:

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

Also im Grunde das die Warnung unter jedem der Felder zeigen sagen, dass es nicht eindeutig ist.

Ich benutze dies viel und es funktioniert einwandfrei.

+0

Danke! Genau das wollte ich. Der einzige Outpoint ist, dass es zwei identische Abfragen erzeugt, wenn zwei Felder validiert werden. – bancer

-1

Sie könnten es in App-Modell setzen, aber mein Vorschlag wäre, es direkt dem Modell hinzuzufügen, indem Sie die Regel mit seiner $validate Eigenschaft platzieren.

Überprüfen Sie die eingebaute isUnique rule.

+0

'isUnique' validiert nur ein Feld für eine einzelne Spalte. Ich brauche die Validierungsregel für zwei Spalten, die den zusammengesetzten eindeutigen Schlüssel bilden. – bancer

+0

Ich verstehe. Es tut uns leid. Dann ja, wenn dies in mehreren Modellen ist, würde ich eine benutzerdefinierte Validierungsregel erstellen und in app_model.php ablegen. –

0

In den CakePHP/2.x-Versionen in den letzten Jahren veröffentlicht, nimmt the isUnique rule optional mehrere Spalten:

können Sie bestätigen, dass eine Reihe von Feldern eindeutig sind durch mehrere Felder Providing und der $or zu false:

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

bin ich der genaue Version nicht sicher, wann die Funktion verfügbar war, aber es gibt a bug fixiert Kern noch im Oktober 2014 eingereicht gegen 2,3 und 2,4 Filialen.

Verwandte Themen