复合唯一索引的验证规则(非主要)

时间:2010-08-10 01:51:36

标签: validation cakephp composite-key

我确信我不是第一个在表中具有复合唯一键并且想要验证它们的人。我不想发明自行车所以我先问这里。我有几个表'id'列作为主键,另外两列作为唯一复合键。最好有一个验证规则来检查提交的条目是否唯一,如果不是则显示验证错误。在Cakephp中,它可以通过自定义验证规则来完成。我很确定有人已经创建了这样的方法。

理想情况下,这将是app_model.php中可以由不同模型使用的方法。

3 个答案:

答案 0 :(得分:11)

我正在使用该功能:

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]) && $this->data[$this->name][$this->primaryKey] > 0) {
            $tmp[$this->primaryKey." !="] = $this->data[$this->name][$this->primaryKey];
        }
    //return false;
        return $this->isUnique($tmp, false); 
    }

基本上用法是:

'field1' => array(
                'checkUnique' => array(
                    'rule' => array('checkUnique', array('field1', 'field2')),
                    'message' => 'This field need to be non-empty and the row need to be unique'
                ),
            ),
'field2' => array(
                'checkUnique' => array(
                    'rule' => array('checkUnique', array('field1', 'field2')),
                    'message' => 'This field need to be non-empty and the row need to be unique'
                ),
            ),

所以基本上这会在每个字段下显示警告,说它不是唯一的。

我正在使用它并且它正常工作。

答案 1 :(得分:0)

在过去几年发布的CakePHP / 2.x版本中,the isUnique rule可选择接受多个列:

  

您可以通过提供多个来验证一组字段是唯一的   字段并将$or设置为false

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

我不确定该功能何时可用的确切版本,但截至2014年10月,已针对2.3和2.4分支机构在核心中修复a bug

答案 2 :(得分:-1)

你可以将它放在app模型中,但我的建议只是将规则与$validate属性放在一起直接添加到模型中。

查看内置的isUnique rule