Validation CakePHP自定义验证规则仅在创建时检查唯一字段组合

Validation CakePHP自定义验证规则仅在创建时检查唯一字段组合,validation,cakephp,unique,updatemodel,Validation,Cakephp,Unique,Updatemodel,我有一个用户模型的数据库。这些用户的姓名和生日应该是唯一的。 因此,我编写了一个名为checkUnique的自定义验证函数 public function checkUnique($check){ $condition = array( "User.name" => $this->data["User"]["name"], "User.lastname" => $this->data["User"]["las

我有一个用户模型的数据库。这些用户的姓名和生日应该是唯一的。 因此,我编写了一个名为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”。(您希望在两个事件中都进行验证)

将自定义验证规则修改为此

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);
}
公共函数checkUnique(){
$condition=array(
“User.name”=>$this->data[“User”][“name”],
“User.lastname”=>$this->data[“User”][“lastname”],
“User.birth”=>this->data[“User”][“birth”]
);
如果(isset($this->data[“User”][“id”])){
$condition[“User.id”]=$this->data[“User”][“id”];
//当
//更新
}
$result=$this->find(“计数”,数组(“条件”=>$condition));
返回($result==0);
}

Correction:$condition[“User.id”]=$this->data[“User”][“id”];谢谢你的回答,它帮助了我!你能帮帮我吗@Guillemo Mansilla