CakePHP 3 - 独特字段的应用规则

时间:2016-07-22 19:02:26

标签: php cakephp cakephp-3.0

我正在尝试添加一个应用程序规则,以防止重复的行被保存。

我遵循了关于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()魔术方法调用它,但由于重复的行尝试保存,我的应用程序仍然会抛出异常。

上面的代码有什么不对吗?

2 个答案:

答案 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;
          }
   }