我有一个登记表中,用户可以在两个电子邮件地址输入(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);
}
有帮助吗?

解决方案

我贴在CakePHP的谷歌集团的溶液这样:

HTTP:// groups.google.com/group/cake-php/browse_frm/thread/b3a1e4ae3eeb6091/e168f54bac27c163?lnk=gst&q=checkUnique#e168f54bac27c163

以下内容添加到您的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" 
                        ) 
                ) 
       ); 

其他提示

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'
        )
    )
);

从CakePHP的2.0文档:

可以验证一组字段是通过提供多个字段独特和设置$或为false:

public $validate = array(
    'email' => array(
        'rule' => array('isUnique', array('email', 'username'), false),
        'message' => 'This username & email combination has already been used.'
    )
);

请务必在进行跨多个领域的一个独特的规则时,包括在字段列表中的原始字段。

如果在模型数据中不包含列出的磁场,那么它会被视为空值。你可以考虑标记列出的字段作为必需的。

YES和NO。

是的,你必须自己编写代码,但CakePHP的验证组件中。

验证组件具有一种机制,允许定制的验证规则。从本质上讲,你把$验证内部函数名(就像你通常会)。你必须定义函数;在这种情况下,这是很简单(只需执行你的双isUnique设置要求)。

HTTP://book.cakephp .ORG / 2.0 / EN /模型/数据validation.html#定制验证规则

目前被打在头上,肩上的提供的风险的非CakePHP的的解决方案,让我来介绍以下内容。

在你的数据库上,你需要然而,许多列创建唯一索引。

本标准的SQL语法是:

create unique index {IndexName} on {Table} ({Column}, {Column}, ...)

将 “$这个 - >型号 - >保存()” 一 “的try / catch” 块的内部命令。在“catch”块,测试错误代码除外。在MySQL中,惟一键冲突的错误代码23000,但你应该了解其他可能的错误和准备。

它的快速和简单的,并且不涉及计数阵列括号。

您应该始终地方数据库访问 “的try / catch” 块反正里面的代码。你的异常处理部分应该包括记录任何意外的错误消息。你不能指望的CakePHP做的所有的你。

据我记得,你必须使用在模型中beforeSave方法这种执法。我有一个对象具有N个集FKS中的至少一个必须的,我只能做这种方式。

编辑:尝试这个线程,看看是否有任何解决了您的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top