以下是验证规则:
'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是否已存在,并且它将在何时找到它并且不会更新。
任何想法?
答案 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..'
)
),