即使使用唯一索引,SilverStripe也会重复输入条目

时间:2016-05-24 18:00:21

标签: sql orm silverstripe

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

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

请注意,我Customer来自Member FirstNameSurname来自的class Customer extends Member

FirstName

但SilverStripe仍然允许Surnamedef add_squares(x, y): return x*x + y*y xs = np.array([0, 0, 1, 1]) ys = np.array([0, 1, 1, 0]) res = add_squares(x, y) 组合的重复输入?有没有人遇到过同样的问题?

3 个答案:

答案 0 :(得分:2)

Man,根据我的经验,即使使用索引,仍然需要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;
}

答案 1 :(得分:2)

  

请注意,我从会员中扩展了客户是FirstName而Surname来自

我想知道SilverStripe是否正在尝试在不存在的字段Customer.FirstNameCustomer.Surname上设置索引。也许尝试通过预先添加实际的表来对列进行限定,如下所示添加索引:

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

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

答案 2 :(得分:2)

在SilverStripe上扩展Member的方法是扩展DataExtension。正如theruss所说,您正在尝试在表Customer上创建一个唯一索引,您可以在其中找不到字段FirstNameSurname。 试试这个

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

然后让SilverStripe在config.yml

中了解您的扩展程序
Member:
  extensions:
    - Customer

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

检查here以获取有关扩展程序的更多信息。