我有一个带有用户模型的数据库。这些用户的名字和生日应该是唯一的。 所以我写了一个名为checkUnique
的自定义验证函数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"
,为什么它也会在更新时触发?
第二个问题:
如果验证规则仅在创建时触发,如果有人像数据库中的其他用户一样更改名称,姓氏和生日,我如何管理,触发验证错误?然后应该触发唯一的验证规则。
答案 0 :(得分:6)
删除'on'=> '创建'。 (您希望在两个事件中进行验证)。
将自定义验证规则修改为此
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);
}