The Man
The Man

Reputation: 435

SilverStripe duplicate entries even with unique index

I'm trying to prevent duplicate records when adding customer records in my CRM with the following index:

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

Note that I extended Customer from Member where FirstName and Surname came from:

class Customer extends Member 

But SilverStripe is still allowing duplicate entries of FirstName and Surname combination? Has anyone experienced the same problem?

Upvotes: 1

Views: 533

Answers (3)

muskie9
muskie9

Reputation: 476

The Man, in my experience a validate() is still needed even when using indexing:

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

Alternately for a more robust 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;
}

Upvotes: 2

Fatal Error
Fatal Error

Reputation: 1024

The way to extend Member on SilverStripe is by extending DataExtension. As theruss is saying, you are trying to create a unique index on the table Customer, where you prabably do not have the fields FirstName and Surname.
Try this instead

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

And then let SilverStripe know about your extension in config.yml

Member:
  extensions:
    - Customer

Now run /dev/build?flush and you should see your index being created.

Check here for more information about extensions.

Upvotes: 2

theruss
theruss

Reputation: 1746

note that I extended Customer from Member were FirstName and Surname came from

I wonder if SilverStripe is attempting to set indexes on the non-existent fields Customer.FirstName and Customer.Surname. Maybe try qualifying the columns by prepending the table that is actually having the indexes added to it like this:

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

You might also consider decorating Member instead of subclassing it. That way you wouldn't need to qualify the query fragments in this way.

Upvotes: 2

Related Questions