2016-07-22 13 views
0

Ich versuche eine Anwendungsregel hinzuzufügen, die verhindert, dass doppelte Zeilen gespeichert werden.CakePHP 3 - Anwendungsregeln für das eindeutige Feld

Ich folgte dem Buch über creating unique field rules, aber es scheint nicht zu funktionieren, oder ich mache etwas falsch.

<?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'])); 
    } 
} 

Nur Durchführung gerade sparen:

$this->loadModel('Customers'); 
$this->Customers->save($customer); 

am IsUnique class source code sah Nachdem ich bekommen, dass es sollte über seine __invoke() magische Methode aufgerufen werden, bekommen aber meine Anwendung nach wie vor wirft eine Ausnahme aufgrund der doppelte Zeile versucht zu speichern.

Gibt es etwas falsch mit meinem Code oben?

+0

Vielleicht aussehen '$ this-> Kunden' nicht eine Instanz Ihrer 'Customers ist 'Unterklasse, aber eine Auto-Tabelle. – ndm

Antwort

0

können Sie nur sein vergessen die Validierung Klasse und Einheit

hinzuzufügen es so

 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

Danke, das war entlang der richtigen Linien. Ich glaube, es war eine automatisch generierte Basis-Entity, also sobald ich eine tatsächliche Entity-Klasse für die Tabelle erstellt hatte, funktionierte es. – BadHorsie

0

Sie sollten hierfür einen eigenen benutzerdefinierten Validator erstellen. Außerdem sollten Sie überprüfen, ob es mit der aktuellen Benutzer-ID übereinstimmt, zum Beispiel, wenn Sie es mit Updates arbeiten lassen wollen.

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

Warum sollte jemand dies tun, wenn die korrekte Verwendung der bestehenden isUnique-Regel ausreichen würde? –