CakePHP 3验证两列内的唯一性


CakePHP 3 Validate unique within two columns

我有一个产品尺寸表

Product Details
id  product_id size
1       1        m
1       1        l
2       2        l

如果我尝试为产品1添加另一个尺寸为m的细节,它应该返回false,但对于产品2,尺寸为m的应该通过

Product Detail Table中是validator

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

不确定如何为列

添加条件

这就是scope选项的作用,它允许您为唯一性约束添加额外的字段。

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

$validator->add('email', [
    'unique' => [
        'rule' => ['validateUnique', ['scope' => 'site_id']],
        'provider' => 'table'
    ]
]);

在上面的例子中,email的唯一性将被限定为只有具有相同site_id的行。只有当要验证的数据中存在范围限定字段时,才会使用范围限定。

API> '蛋糕' ORM '表::validateUnique ()

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

您可以使用内置的IsUnique规则,您可以简单地将多个列名传递给该规则。

use Cake'ORM'RulesChecker;
// ...
public function buildRules(RulesChecker $rules)
{
    $rules->add($rules->isUnique(['product_id', 'size']));
    return $rules;
}

参见

  • Cookbook>数据库访问&
  • Cookbook>数据库访问&ORM>验证数据>创建唯一字段规则
  • Cookbook>数据库访问&ORM>验证数据>使用验证作为应用规则