CakePHP 3在两列中验证唯一

时间:2015-08-24 14:01:46

标签: php validation cakephp cakephp-3.0

我有一张产品尺寸表

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

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

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

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

不确定如何为列添加条件

1 个答案:

答案 0 :(得分:14)

这是scope选项的用途,它允许您向唯一性约束添加其他字段。

  

唯一验证的范围可以是另一列的值:

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

在上面的示例中,电子邮件唯一性将限定为仅具有相同site_id的行。仅当要验证的数据中存在作用域字段时,才会使用作用域。

<强> API > \Cake\ORM\Table::validateUnique()

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

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

use Cake\ORM\RulesChecker;

// ...

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

    return $rules;
}

另见