SilverStripe 重复条目,即使具有唯一索引
SilverStripe duplicate entries even with unique index
我在使用以下索引在我的 CRM 中添加客户记录时试图防止重复记录:
private static $indexes = array(
'IndexFirstSurName' => array(
'type' => 'unique',
'value' => '"FirstName","Surname"'
)
);
请注意,我从 Member
扩展了 Customer
,其中 FirstName
和 Surname
来自:
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;
}
note that I extended Customer from Member were FirstName and Surname came from
我想知道 SilverStripe 是否试图在不存在的字段 Customer.FirstName
和 Customer.Surname
上设置索引。也许尝试通过在 table 前面加上 实际上 的索引来限定列,如下所示:
private static $indexes = array(
'IndexFirstSurName' => array(
'type' => 'unique',
'value' => '"Member"."FirstName","Member"."Surname"'
)
);
您也可以考虑 装饰 Member
而不是子类化它。这样您就不需要以这种方式限定查询片段。
在 SilverStripe 上扩展 Member
的方法是扩展 DataExtension
。正如 theruss 所说,您正在尝试在 table 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
您应该会看到正在创建索引。
查看 here 了解有关扩展的更多信息。
我在使用以下索引在我的 CRM 中添加客户记录时试图防止重复记录:
private static $indexes = array(
'IndexFirstSurName' => array(
'type' => 'unique',
'value' => '"FirstName","Surname"'
)
);
请注意,我从 Member
扩展了 Customer
,其中 FirstName
和 Surname
来自:
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;
}
note that I extended Customer from Member were FirstName and Surname came from
我想知道 SilverStripe 是否试图在不存在的字段 Customer.FirstName
和 Customer.Surname
上设置索引。也许尝试通过在 table 前面加上 实际上 的索引来限定列,如下所示:
private static $indexes = array(
'IndexFirstSurName' => array(
'type' => 'unique',
'value' => '"Member"."FirstName","Member"."Surname"'
)
);
您也可以考虑 装饰 Member
而不是子类化它。这样您就不需要以这种方式限定查询片段。
在 SilverStripe 上扩展 Member
的方法是扩展 DataExtension
。正如 theruss 所说,您正在尝试在 table Customer
上创建一个唯一索引,您可能没有字段 FirstName
和 Surname
.
试试这个
class Customer extends DataExtension
{
private static $indexes = array(
'IndexFirstSurName' => array(
'type' => 'unique',
'value' => '"FirstName","Surname"'
)
);
}
然后在 config.yml
Member:
extensions:
- Customer
现在 运行 /dev/build?flush
您应该会看到正在创建索引。
查看 here 了解有关扩展的更多信息。