我正在尝试添加一个应用程序规则,以防止重复的行被保存。
我遵循了关于creating unique field rules的书,但它似乎不起作用,或者我做错了。
<?php
namespace App\Model\Table;
use Cake\ORM\Rule\IsUnique;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
class CustomersTable extends Table
public function buildRules(RulesChecker $rules)
{
return $rules->add($rules->isUnique(['email']));
}
}
只是执行直接保存:
$this->loadModel('Customers');
$this->Customers->save($customer);
看了IsUnique class source code之后,我知道应该通过__invoke()
魔术方法调用它,但由于重复的行尝试保存,我的应用程序仍然会抛出异常。
上面的代码有什么不对吗?
答案 0 :(得分:0)
您应该为此创建自己的自定义验证器。此外,您应该检查它是否与当前用户ID匹配,例如,如果您想让它适用于更新。
public function validationDefault(Validator $validator)
{
$validator->add('email', 'uniqueEmail', [
'rule' => function ($value, $context) {
if(isset($context['data']['id'])) {
return !$this->exists(['email' => $value, 'id !=' => $context['data']['id']]);
}
return !$this->exists(['email' => $value]);
},
'message' => 'Email address already registered',
]);
return $validator;
}
答案 1 :(得分:0)
可能你忘了添加验证类和实体
可能看起来像这样
namespace App\Model\Table;
use App\Model\Entity\Customer;//
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class CustomersTable extends Table
{
public function initialize(array $config)
{
$this->addBehavior('Timestamp');//
//$this->table('customers'); *u can also specify ur table like this
}
public function validationDefault(Validator $validator)
{
$validator
->notEmpty('email')
->requirePresence('email')
return $validator;
}
public function buildRules(RulesChecker $rules)
{
$rules->add($rules->isUnique(array('email')));
return $rules;
}
}