SilverStripe 重复条目,即使具有唯一索引

SilverStripe duplicate entries even with unique index

我在使用以下索引在我的 CRM 中添加客户记录时试图防止重复记录:

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

请注意,我从 Member 扩展了 Customer,其中 FirstNameSurname 来自:

class Customer extends Member 

但是 SilverStripe 仍然允许 FirstNameSurname 组合的重复条目?有没有人遇到过同样的问题?

老兄,根据我的经验,即使使用索引,仍然需要 validate():

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

或者更强大的突破:

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

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

我想知道 SilverStripe 是否试图在不存在的字段 Customer.FirstNameCustomer.Surname 上设置索引。也许尝试通过在 table 前面加上 实际上 的索引来限定列,如下所示:

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

您也可以考虑 装饰 Member 而不是子类化它。这样您就不需要以这种方式限定查询片段。

在 SilverStripe 上扩展 Member 的方法是扩展 DataExtension。正如 theruss 所说,您正在尝试在 table Customer 上创建一个唯一索引,您可能没有字段 FirstNameSurname.
试试这个

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

然后在 config.yml

中让 SilverStripe 知道您的扩展
Member:
  extensions:
    - Customer

现在 运行 /dev/build?flush 您应该会看到正在创建索引。

查看 here 了解有关扩展的更多信息。