在CakePhp 4中,如何为多个字段指定唯一约束验证器?

3
在我的数据库中,我有这个表格:
table `candidates` (
      id,
      email,
      department
)

需要保证邮箱和部门都是唯一的(您可以使用相同的电子邮件在两个不同的部门申请职位,但不能使用相同的电子邮件在同一部门申请两次)。这是在我的SQL数据库中构建的。

我卡在了如何在CakePHP验证器中检查这一点,因为我可以检查两个单独字段的唯一性,但无法检查两个字段的组合。在CakePHP2中似乎是可能的,如此显示的https://book.cakephp.org/2/en/models/data-validation.html#Model::Validation::isUnique,使用这种数组方法。

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

但是现在验证器的工作方式有所不同,我似乎找不到解决这个问题的方法。

编辑:

这里是我的代码,但它无法正常工作。

    public function validationDefault(Validator $validator): Validator
    {
        ...

        $validator
            ->email('email')
            ->requirePresence('email', 'create')
            ->notEmptyString('email')
            ->add('email', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']);

        return $validator;
    }

    public function buildRules(RulesChecker $rules): RulesChecker
    {
        $rules->add($rules->isUnique(['email', 'vac_no']), 'This email has already been used for this vacancy');
        return $rules;
    }

Thanks

Sims Olden


那么,你如何验证单个字段的唯一性呢?通过validateUnique规则吗? - undefined
我对cakePHP还不太熟悉,对于验证器和规则有些困惑,它们似乎有些混在一起,尤其是通过validateUnique规则。 - undefined
我已经编辑了帖子,这样你就可以看到我目前的进展了。 - undefined
验证器仍按照文档中的方式工作。域规则只是一种不同(而且通常不正确)的做事方式。因此,在3.x和4.x版本中,只需使用文档中的方式,一切都会按预期运行。 - undefined
1个回答

3
从cakephp 4.2开始,您应该在这里查找: 用户表类的代码示例:
use Cake\ORM\RulesChecker;
use Cake\ORM\Rule\IsUnique;

public function buildRules(RulesChecker $rules): RulesChecker {
    $rules->add($rules->isUnique(['email', 'department'], __('The email and department should be unique')));
return $rules;
}

https://book.cakephp.org/4/en/orm/validation.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接