在CakePHP中编辑记录时应用唯一规则

时间:2013-09-20 11:54:19

标签: cakephp cakephp-2.3

以下是验证规则:

'name'=>array(
        'Please enter customer\'s name'=>array(
            'rule'=>'notEmpty',
            'message'=>'Please enter customer\'s name'
        ),
        'Unique' => array(
            'rule' => array('nameIsUniqueForCompany'),
            'message' => 'Customer with these initials already exists'
        )
    ),  


public function initialsAreUniqueForCompany($data){

    $company_id = $this->data['Customer']['company_id'];
    $initials = $this->data['Customer']['initials'];

    if($this->find('first', array('conditions'=>array('initials'=>$initials, 'company_id'=>$company_id))))
    {
        return false;

    }
    return true;        
}

问题是该规则适用于当前对象。假设我想更新名为'ABC'的客户,但我只是更改了他的电话号码。然后,应用程序将查看名称ABC是否已存在,并且它将在何时找到它并且不会更新。

任何想法?

4 个答案:

答案 0 :(得分:2)

您的实施存在缺陷: 根据设计,您的验证规则将始终仅适用于添加,而不适用于编辑。 在编辑时,您还需要考虑当前的ID。

查看我的http://www.dereuromark.de/2011/10/07/maximum-power-for-your-validation-rules/帖子。关于唯一性的部分包含一种工作方法。 对您而言,这意味着,使用我增强的唯一验证方法:

'name' => array(
    'validate' => array(
        'rule' => array('validateUnique', array('company_id')),
        'message' => 'Customer with these initials already exists',
    ),
),

基本上,您总是在编辑时提交ID(通过隐藏的表单字段 - 无论如何都是由烘焙表单自动完成),并在您的条件中使用“id!= current”将其从查找结果中删除:

$this->alias . '.id !=' => $id

推理:当前编辑的记录不应该触发验证规则错误,当然:)

答案 1 :(得分:2)

你可以传递这样的东西:

'email' => array(
        'unique' => array(
            'rule' => 'isUnique',
            'message'=>'This e-mail has been used already',
            'on'=>'create'
        )
)

数组中有一个节点'on'=>'create',仅在创建记录时才应用该规则。当然还有'on'=>'update',这将在记录更新时适用。

对于更新验证,您应该考虑自定义规则,其中您要检查行ID是否不同。

答案 2 :(得分:0)

在您的控制器中

public function edit($id = null) {
    if ($this->request->isPut() || $this->request->isPost()) {
        if ($this->YourModel->save()){
            // do what ever you want
        }
    } else {
        $this->request->data = $this->YourModel->read(null, $id)    
    }
}

并在 edit.ctp 文件中

echo $this->Form->create('YourModel');
echo $this->Form->hidden('id');

如果您发现任何问题,请告诉我,很高兴为您提供帮助。

答案 3 :(得分:0)

你可以尝试

'subscription_name' => array
                                (
                                        'required'=>true,
                                        'rule'    => 'notEmpty',
                                        'message' => 'Please enter Package name.',
                                        'Unique'=>array(
                                        'rule'   => 'isUnique',
                                        'message'=>'package name is already exit..'
                                        )
                                ),