2013-12-03 4 views
3

У меня есть база данных с моделью пользователя. Эти пользователи должны быть уникальными по имени и дню рождения. Так что я написал пользовательскую функцию проверки под названием checkUniqueCakePHP custom Validation проверяет уникальную комбинацию полей только при создании

public function checkUnique($check){ 
     $condition = array(
      "User.name" => $this->data["User"]["name"], 
      "User.lastname" => $this->data["User"]["lastname"], 
      "User.birthday" => $this->data["User"]["birthday"] 
     ); 

     $result = $this->find("count", array("conditions" => $condition)); 

     return ($result == 0); 
} 

Правило валидации в модели:

"name" => array(
     "checkUnique" => array(
      "rule" => array("checkUnique"), 
      "message" => "This User already exists.", 
      "on" => "create" 
     ), 
) 

У меня есть две проблемы. Первое: Это правило проверки также триггеры на действия обновления, реализованная в виде

public function edit($id = null) { 
     if (!$this->User->exists($id)) { 
      throw new NotFoundException(__('Invalid User')); 
     } 
     if ($this->request->is(array('post', 'put'))) { 
      if ($this->User->save($this->request->data)) { 
       $this->Session->setFlash(__('Update done.')); 
       return $this->redirect(array('action' => 'index')); 
      } else { 
       $this->Session->setFlash(__('The user can't be saved.')); 
      } 
     } else { 
      $options = array('conditions' => array('User.' . $this->User->primaryKey => $id)); 
      $this->request->data = $this->User->find('first', $options); 
     } 
    } 

Но я писал "on" => "create", так почему это вызывает также на обновление? Вторая проблема: Если правило проверки только срабатывает при создании, как я могу управлять, инициировать ошибку проверки, если кто-то изменяет имя, фамилию и день рождения, как другой пользователь в базе данных? Затем следует запустить уникальное правило проверки.

ответ

6

Удалить 'on' => 'create'. (Вы хотите проверить в обоих случаях).

Измените пользовательские правила проверки для этого

public function checkUnique() { 
    $condition = array(
     "User.name" => $this->data["User"]["name"], 
     "User.lastname" => $this->data["User"]["lastname"], 
     "User.birthday" => $this->data["User"]["birthday"] 
    ); 
    if (isset($this->data["User"]["id"])) { 
     $condition["User.id <>"] = $this->data["User"]["id"]; 
     //your query will be against id different than this one when 
     //updating 
    } 
    $result = $this->find("count", array("conditions" => $condition)); 
    return ($result == 0); 
} 
+0

Спасибо! прекрасно работает! – SPie

+1

Коррекция: $ condition ["User.id <>"] = $ this-> data ["Пользователь"] ["id"]; – MotsManish

+0

Спасибо за ответ, это помогло мне! – TommyDo