CakePHP 3在两列中验证唯一性

CakePHP 3在两列中验证唯一性,php,validation,cakephp,cakephp-3.0,Php,Validation,Cakephp,Cakephp 3.0,我有一张产品尺寸表 Product Details id product_id size 1 1 m 1 1 l 2 2 l 如果我尝试在产品1中添加另一个尺寸为m的详细信息,则应返回false,但对于产品2,尺寸为m的详细信息应通过 在我的产品详细信息表中,这里是验证器 //Product Detail Table public function validationDefault(Validator $val

我有一张产品尺寸表

Product Details
id  product_id size
1       1        m
1       1        l
2       2        l
如果我尝试在产品1中添加另一个尺寸为m的详细信息,则应返回false,但对于产品2,尺寸为m的详细信息应通过

在我的产品详细信息表中,这里是验证器

 //Product Detail Table
public function validationDefault(Validator $validator){
$validator
        ->add('size', 'unique', ['rule' => 'validateUnique', 'provider' => 'table'])

不确定如何为列

添加条件这就是
范围
选项的作用,它允许您向唯一性约束添加其他字段

唯一验证的范围可以限定为另一列的值:

$validator->add('email', [
    'unique' => [
        'rule' => ['validateUnique', ['scope' => 'site_id']],
        'provider' => 'table'
    ]
]);
在上面的示例中,电子邮件唯一性的作用域将仅限于具有相同站点id的行。仅当要验证的数据中存在作用域字段时,才会使用作用域

但是,这至少应该是一个应用程序规则,因为它容易出现竞争条件,因此需要在事务中进行检查,默认情况下,这只会发生在应用程序规则中

您可以使用内置的
IsUnique
规则,只需将多个列名传递给它即可

use Cake\ORM\RulesChecker;

// ...

public function buildRules(RulesChecker $rules)
{
    $rules->add($rules->isUnique(['product_id', 'size']));

    return $rules;
}
另见


谢谢,我知道它存在,但找不到。同样,你的第一个例子对我不起作用,但第二个确实起作用。你知道为什么吗?@artSir我至少要看一下相关的代码才能知道,比如验证规则和触发验证的代码。请注意,第一个示例只是引用了文档中的一句话。很抱歉,我应该更好地阐述我的问题,验证器和构建规则之间的区别是什么。比如谁先被叫来?生成规则仅在“创建”上,对吗?validator在所有创建和更新上都正确吗?@artSir否,它们在两个不同的位置被调用,谢谢,现在有意义了,我认为validator在save()上被调用了,但它不仅仅是newEntity和patchEntity。