2010-08-10 13 views
6

Jestem pewna, że ​​nie jestem pierwszym, który ma złożone unikatowe klucze w tabelach i kto chce je potwierdzić. Nie chcę wymyślać roweru, więc najpierw proszę tutaj. Mam kilka tabel, które mają kolumny "id" jako klucze podstawowe i dwie inne kolumny jako unikalne klucze złożone. Byłoby miło mieć regułę sprawdzania poprawności, aby sprawdzić, czy przesłany wpis jest unikalny i wyświetlić błąd sprawdzania poprawności, jeśli tak nie jest. W Cakephp można to zrobić za pomocą niestandardowej reguły sprawdzania poprawności. Jestem prawie pewien, że ktoś już stworzył taką metodę.Reguła sprawdzania poprawności dla indeksu unikatowego złożonego

Idealnie byłoby metodą w app_model.php, która może być używana przez różne modele.

Odpowiedz

11

używam tej funkcji:

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

zasadzie użycia:

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

Więc w zasadzie to pokaże ostrzeżenie pod każdym z pól, mówiąc, że nie jest wyjątkowy.

Używam tego bardzo i działa poprawnie.

+0

Dzięki! Właśnie tego chciałem. Jedynym punktem wyjścia jest to, że generuje 2 identyczne zapytania po sprawdzeniu 2 pól. – bancer

-1

Można umieścić go w modelu aplikacji, ale moja sugestia będzie po prostu dodać go do modelu bezpośrednio poprzez umieszczenie reguły z jego właściwością $validate.

Zapoznaj się z wbudowanym isUnique rule.

+0

"isUnique" sprawdza tylko jedno pole dla pojedynczej kolumny. Potrzebuję reguły sprawdzania poprawności dla dwóch kolumn, które tworzą złożony klucz unikalny. – bancer

+0

Rozumiem. Przepraszam. Wtedy tak, jeśli jest to coś w wielu modelach, zbudowałbym niestandardową regułę sprawdzania poprawności i umieściłem ją w app_model.php. –

0

W wersjach CakePHP/2.x wydanych w ciągu ostatnich kilku lat, the isUnique rule opcjonalnie akceptuje kilka kolumn:

Można potwierdzić, że zestaw pól są unikalne, dostarczając wielu pola i ustawić $or do false:

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

nie jestem pewien dokładnej wersji, gdy funkcja była dostępna, ale nie a bug ustalona rdzeń dopiero w październiku 2014 r. wystąpił przeciwko oddziałom 2,3 i 2,4.

Powiązane problemy