2016-07-22 18 views
0

重複する行が保存されないようにするアプリケーションルールを追加しようとしています。CakePHP 3 - 固有のフィールドのアプリケーションルール

私は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

のように見えるかもしれたぶん 'ます$ this-> Customers'は、あなたの' CustomersTableのインスタンスではありません'サブクラスですが、オートテーブルです。 – ndm

答えて

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

ありがとう、これは正しい行に沿っていた。私は自動生成されたベースエンティティを使用していたと考えています。そのため、実際に動作したテーブルの実際のEntityクラスを作成するとすぐに、 – BadHorsie

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

既存のisUniqueルールを正しく使用すれば、誰でもこれを行う必要がありますか? –

関連する問題