CakePHP 3-唯一字段的应用程序规则
我正在尝试添加一个应用程序规则,以防止保存重复的行 我看了这本书,但它似乎不起作用,或者我做错了什么CakePHP 3-唯一字段的应用程序规则,php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,我正在尝试添加一个应用程序规则,以防止保存重复的行 我看了这本书,但它似乎不起作用,或者我做错了什么 <?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
<?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']));
}
}
查看之后,我发现应该通过它的\uu invoke()
magic方法调用它,但是我的应用程序仍然抛出异常,因为重复的行试图保存
我上面的代码有什么错误吗?您应该为此创建自己的自定义验证器。此外,您还应该检查它是否与当前用户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;
}
可能您只是忘记了添加验证类和实体 它可能看起来像这样
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;
}
}
也许
$this->Customers
不是您的CustomersTable
子类的实例,而是一个自动表。当正确使用现有的isUnique规则就足够了时,为什么要这样做呢?谢谢,这是正确的。我相信它使用的是一个自动生成的基本实体,所以只要我为表创建了一个实际的实体类,它就工作了。
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;
}
}