[英]SilverStripe duplicate entries even with unique index
当我在具有以下索引的CRM中添加客户记录时,我试图防止重复记录:
private static $indexes = array(
'IndexFirstSurName' => array(
'type' => 'unique',
'value' => '"FirstName","Surname"'
)
);
请注意,我从FirstName
和Surname
来自的Member
扩展了Customer
:
class Customer extends Member
但是SilverStripe仍然允许FirstName
和Surname
组合的重复条目吗? 有没有人遇到过同样的问题?
这个人,以我的经验,即使使用索引也仍然需要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;
}
请注意,我从“会员”扩展的“客户”是“名字”和“姓氏”来自
我想知道SilverStripe是否正在尝试在不存在的字段Customer.FirstName
和Customer.Surname
上设置索引。 也许可以通过在实际在表上添加索引的表之前尝试对列进行限定,如下所示:
private static $indexes = array(
'IndexFirstSurName' => array(
'type' => 'unique',
'value' => '"Member"."FirstName","Member"."Surname"'
)
);
您可能还考虑装饰 Member
而不是对其进行子类化。 这样,您就不需要以这种方式限定查询片段。
在SilverStripe上扩展Member
的方法是扩展DataExtension
。 就像Theruss所说的那样,您正在尝试在表Customer
上创建唯一索引,但您可能在其中没有FirstName
和Surname
字段。
试试这个
class Customer extends DataExtension
{
private static $indexes = array(
'IndexFirstSurName' => array(
'type' => 'unique',
'value' => '"FirstName","Surname"'
)
);
}
然后在config.yml
让SilverStripe知道您的扩展名
Member:
extensions:
- Customer
现在运行/dev/build?flush
,您应该看到正在创建索引。
在此处查看有关扩展的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.