我有一个注册表,用户可以在其中填写两个电子邮件地址(email1& email2)。市场营销的要求是它们必须是唯一的(如果我们有10个用户,那么就会有10 * 2 = 20个唯一的电子邮件地址)。
系统已经建立在cakephp上,所以我想知道的是,有什么类似于isUnique功能(在一个字段中是唯一的)可以直接执行此操作吗?或者我注定要自己编码?提前谢谢。
编辑:建立在理查德的榜样上,这对我有用:
function checkUnique($data, $fields) {
if (!is_array($fields)) {
$fields = array($fields);
}
foreach($data as $key) {
$checks = $key;
}
if (empty($checks)) {
return true; //allow null
}
foreach($fields as $key) {
$tmp[$key] = $checks;
}
if (isset($this->data[$this->name][$this->primaryKey])) {
$tmp[$this->primaryKey] = "<>".$this->data[$this->name][$this->primaryKey];
}
return $this->isUnique($tmp);
}
答案 0 :(得分:13)
我在CakePHP Google Group上发布了一个解决方案:
将以下内容添加到您的AppModel:
/**
* checks is the field value is unqiue in the table
* note: we are overriding the default cakephp isUnique test as the
original appears to be broken
*
* @param string $data Unused ($this->data is used instead)
* @param mnixed $fields field name (or array of field names) to
validate
* @return boolean true if combination of fields is unique
*/
function checkUnique($data, $fields) {
if (!is_array($fields)) {
$fields = array($fields);
}
foreach($fields as $key) {
$tmp[$key] = $this->data[$this->name][$key];
}
if (isset($this->data[$this->name][$this->primaryKey])) {
$tmp[$this->primaryKey] = "<>".$this->data[$this->name][$this-
>primaryKey];
}
return $this->isUnique($tmp, false);
}
}
并在您的模型中使用验证:
var $validate = array(
"name"=>array(
"unique"=>array(
"rule"=>array("checkUnique", array("name", "institution_id")),
"message"=>"A contact with that name already exists for that
institution"
)
)
);
答案 1 :(得分:12)
checkUnique
可以写成isUnique
的包装。
class AppModel extends Model {
public function checkUnique($ignoredData, $fields, $or = true) {
return $this->isUnique($fields, $or);
}
}
并在您的模型中使用验证:
public $validate = array(
'name' => array(
'unique' => array(
'rule' => array('checkUnique', array('name', 'institution_id'), false),
'message' => 'A contact with that name already exists for that
institution'
)
)
);
答案 2 :(得分:3)
From cakePHP 2.0 documentation:
You can validate that a set of fields are unique by providing multiple fields and set $or to false:
public $validate = array(
'email' => array(
'rule' => array('isUnique', array('email', 'username'), false),
'message' => 'This username & email combination has already been used.'
)
);
Make sure to include the original field in the list of fields when making a unique rule across multiple fields.
If a listed field isn’t included in the model data, then it’s treated as a null value. You may consider marking the listed fields as required.
答案 3 :(得分:-1)
是和否。
是的,您必须自己编写代码,但在CakePHP验证组件中。
验证组件具有允许自定义验证规则的机制。基本上,你将函数名称放在$ validate中(就像你通常那样)。你必须定义这个功能;在这种情况下,它非常简单(只需强制执行双重isUnique要求)。
http://book.cakephp.org/2.0/en/models/data-validation.html#custom-validation-rules
答案 4 :(得分:-1)
冒着被提供非CakePHP 解决方案而头疼肩膀的风险,让我来介绍以下内容。
在数据库中创建一个唯一的索引,无论您需要多少列。
标准SQL语法是:
create unique index {IndexName} on {Table} ({Column}, {Column}, ...)
将“$ this-&gt; Model-&gt; save()”命令放在“try / catch”块中。在“catch”块中,测试错误代码的异常。在MySQL中,唯一的密钥违规是错误代码23000,但您也应该为其他可能的错误做好准备。
它快速而简单,不涉及计算数组括号。
您应该始终将数据库访问代码置于“try / catch”块中。部分异常处理应包括记录任何意外的错误消息。你不能指望CakePHP为你做一切。
答案 5 :(得分:-2)
据我记忆,您必须使用模型中的beforeSave
方法进行此类强制执行。我要求一个对象至少有一个N fks设置,我只能这样做。
修改:尝试this thread,看看是否有任何问题可以解决您的问题。