2016-05-24 8 views
1

Ich versuche, doppelte Datensätze zu verhindern, wenn mit dem folgenden Index von Kundendaten in meinem CRM hinzu:Silvers doppelte Einträge auch mit eindeutigem Index

private static $indexes = array(
    'IndexFirstSurName' => array(
     'type' => 'unique', 
     'value' => '"FirstName","Surname"' 
    ) 
); 

Bitte beachte, dass ich Customer von Member erweitert, wo FirstName und Surname kamen aus :

class Customer extends Member 

Aber Silvers noch doppelte Einträge von FirstName und Surname Kombination ist erlaubt? Hat jemand das gleiche Problem erlebt?

Antwort

2

Der Mann, in meiner Erfahrung eine validate() wird auch noch benötigt, wenn die Indizierung mit:

public function validate() { 
    $result = parent::validate(); 

    if(Member::get()->filter(array('FirstName' => $this->FirstName, 'Surname' => $this->Surname))->first()) { 
     $result->error('First and Surname must be unique for each member.'); 
    } 

    return $result; 
} 

Alternativ für eine robustere Breakout:

public function validate() { 
    $result = parent::validate(); 

    if($member = Member::get()->filter(array('FirstName' => $this->FirstName, 'Surname' => $this->Surname))->first()) { 
     if($member->FirstName == $this->FirstName){ 
      $result->error('Your Surname is fine, please change your First Name.'); 
     } 
     if($member->Surname == $this->Surname){ 
      $result->error('Your First Name is fine, please change your Surname.'); 
     } 
    } 

    return $result; 
} 
+0

dies ist eine gute Möglichkeit, Felder zu validieren, aber ich denke, Silverstripe eindeutigen Index wird nutzlos gemacht. –

+0

@ muskie9 - sollte das nicht ein Validierungsfehler sein und das Feld speziell erwähnen .... so dass der Fehler neben diesem Feld erscheint? – Barry

+0

@Barry ja, könnte zusätzliche Logik getan werden, um das genaue Feld zu bestimmen, aber dies wäre das Minimum, um sicherzustellen, dass keine anderen Datensätze die FirstName/Nachnamen Werte teilen. – muskie9

2

beachten Sie, dass ich Kunden erweitert von Mitglied waren Vorname und Nachname kamen von

Ich frage mich, ob SilverStripe versucht, Indizes für die nicht vorhandenen Felder Customer.FirstName und Customer.Surname festzulegen. Vielleicht versuchen, die Spalten der Qualifikation durch die Tabelle vorangestellt, die tatsächlich ist die Indizes es wie folgt hinzugefügt haben:

private static $indexes = array(
    'IndexFirstSurName' => array(
     'type' => 'unique', 
     'value' => '"Member"."FirstName","Member"."Surname"' 
    ) 
); 

Sie auch Member Dekoration betrachten könnte, anstatt sie zu Subklassen. Auf diese Weise müssten Sie die Abfragefragmente nicht auf diese Weise qualifizieren.

2

Der Weg zum Erweitern Member auf SilverStripe ist durch Erweitern DataExtension. Wie der Spruch sagt, versuchen Sie, einen eindeutigen Index für die Tabelle Customer zu erstellen, wo Sie prabably die Felder FirstName und Surname nicht haben.
Versuchen Sie stattdessen

class Customer extends DataExtension 
{ 
    private static $indexes = array(
     'IndexFirstSurName' => array(
      'type' => 'unique', 
      'value' => '"FirstName","Surname"' 
     ) 
    ); 
} 

Und dann lassen Silvers

Member: 
    extensions: 
    - Customer 

Jetzt /dev/build?flush in config.yml über Ihre Erweiterung wissen, laufen und Sie sollten Ihren Index wird erstellt sehen.

Überprüfen Sie here für weitere Informationen über Erweiterungen.

Verwandte Themen