我有一个产品尺寸表
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>验证数据>使用验证作为应用规则