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

Validation 复合唯一索引的验证规则(非主),validation,cakephp,composite-key,Validation,Cakephp,Composite Key,我确信我不是第一个在表中拥有复合唯一键并希望验证它们的人。我不想发明自行车,所以我先问这里。我有几个表,其中“id”列作为主键,另外两列作为唯一的组合键。最好有一个验证规则来检查提交的条目是否唯一,如果不唯一,则显示验证错误。在Cakephp中,它可以通过自定义验证规则来完成。我敢肯定已经有人创造了这样的方法 理想情况下,它应该是app_model.php中的一个方法,可以由不同的模型使用。您可以将它放在app model中,但我的建议是直接将它添加到模型中,方法是将规则与它的$validate

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


理想情况下,它应该是app_model.php中的一个方法,可以由不同的模型使用。

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


查看内置功能。

我正在使用该功能:

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'
                ),
            ),
基本上,这会在每个字段下显示警告,表示它不是唯一的


我经常使用它,它工作正常。

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

您可以通过提供多个字段来验证一组字段是否唯一 字段并将
$或
设置为
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分支提交了core中的fixed。

“isUnique”仅验证单个列的一个字段。我需要组成复合唯一键的两列的验证规则。我明白了。很抱歉然后是的,如果这是多个模型中的某个东西,我会构建一个自定义验证规则并将其放在app_model.php中。谢谢!这正是我想要的。唯一的输出点是,当验证两个字段时,它会生成两个相同的查询。