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;
}
另见