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