我使用Silverstripes'在产品和类别之间建立了多对多的关系。 ORM。一切正常,除非我尝试为产品添加类别时,类别的选项由用户ID而不是类别名称显示。我试图将ID映射到名称但不起作用。以下是我试过的,我错过了什么?
class Product extends DataObject {
private static $db = array(
'ProductName' => 'Varchar(32)',
);
private static $many_many = array (
'Category' => 'Category'
);
}
class Category extends DataObject {
private static $db = array(
'Category' => 'Varchar(32)',
);
public function searchableFields() {
return array (
'Category' => array (
'filter' => 'ExactMatchFilter',
'title' => 'Category',
'field' => 'TextField'->setSource(
$this::get()->map('ID','Category')
)
)
);
}
private static $belongs_many_many = array (
'Product' => 'Product'
);
}
答案 0 :(得分:4)
当Silverstripe需要显示DataObject的速记时,它将调用该DataObject上的getTitle()方法。
getTitle()
将首先检查DataObject是否有Title
字段,如果有,则返回该值。
如果您的DataObject没有Title
字段,它会尝试搜索Name
字段。
如果它也找不到Name
字段,它将默认返回DataObject的ID,这可能就是你发生的事情。
如何修复您的具体示例
您有两种方法可以修复您的具体示例:
Name
或Title
getTitle()
方法解决方案#1
class Product extends DataObject {
private static $db = array(
'Name' => 'Varchar(32)',
);
private static $many_many = array (
'Category' => 'Category'
);
}
class Category extends DataObject {
private static $db = array(
'Name' => 'Varchar(32)',
);
public function searchableFields() {
return array (
'Category' => array (
'filter' => 'ExactMatchFilter',
'title' => 'Category',
'field' => 'TextField'->setSource(
$this::get()->map('ID','Category')
)
)
);
}
private static $belongs_many_many = array (
'Product' => 'Product'
);
}
解决方案#2
class Product extends DataObject {
private static $db = array(
'ProductName' => 'Varchar(32)',
);
private static $many_many = array (
'Category' => 'Category' );
public function getTitle() {
return $this->ProductName;
}
}
class Category extends DataObject {
private static $db = array(
'Category' => 'Varchar(32)',
);
public function searchableFields() {
return array (
'Category' => array (
'filter' => 'ExactMatchFilter',
'title' => 'Category',
'field' => 'TextField'->setSource(
$this::get()->map('ID','Category')
)
)
); }
private static $belongs_many_many = array (
'Product' => 'Product' );
public function getTitle() {
return $this->Category;
}
}
哪种解决方案最好?
在您的具体情况下,我会使用解决方案#1,因为您的数据库字段是功能名称/标题字段。
如果我的DataObject的标题需要使用很多字段,我会使用解决方案#2。让我们假设你有一个Person
DataObject,它有一个名字和一个姓氏:
public function getTitle() {
return $this->FirstName . ' ' . $this->LastName;
}