Silverstripe - 不同的下拉字段
Silverstripe - Distinct Dropdown Fields
我正在尝试使用来自数据对象的 states/provinces 填充下拉列表,但有许多记录具有相同的状态。我怎样才能只显示不同的状态?
这 returns 不同的状态:
$states= DataObject::get()->distinct(true)->column('State');
这在我的下拉列表中显示为不同的值:
DropdownField::create('State', 'State', $states)
->setEmptyString('(Select one)'),
但这仅将下拉列表中的值显示为状态,而不是将 ID 显示为状态。我还可以如何填充 ID?
当我将它们添加到数组时它不喜欢它。
您可以使用 SS_Map
和 array_unique()
。它不如手动构建数据库查询高效,但它可以很好地完成工作,除非您有数千行,否则不会有问题。
$statesMap = MyStateDataObject::get()->map('ID', 'State');
$states = array_unique($statesMap->toArray());
$field = DropdownField::create('State', 'State', $states);
另一种方法是构建数据库查询来执行此操作,例如:
$query = SQLSelect::create()
->setSelect(array('ID', 'State'))
->setFrom('MyStateDataObject')
->setGroupBy('State');
$states = array();
foreach ($query->execute() as $row) {
$states[$row['ID']] = $row['State'];
}
我正在尝试使用来自数据对象的 states/provinces 填充下拉列表,但有许多记录具有相同的状态。我怎样才能只显示不同的状态?
这 returns 不同的状态:
$states= DataObject::get()->distinct(true)->column('State');
这在我的下拉列表中显示为不同的值:
DropdownField::create('State', 'State', $states)
->setEmptyString('(Select one)'),
但这仅将下拉列表中的值显示为状态,而不是将 ID 显示为状态。我还可以如何填充 ID?
当我将它们添加到数组时它不喜欢它。
您可以使用 SS_Map
和 array_unique()
。它不如手动构建数据库查询高效,但它可以很好地完成工作,除非您有数千行,否则不会有问题。
$statesMap = MyStateDataObject::get()->map('ID', 'State');
$states = array_unique($statesMap->toArray());
$field = DropdownField::create('State', 'State', $states);
另一种方法是构建数据库查询来执行此操作,例如:
$query = SQLSelect::create()
->setSelect(array('ID', 'State'))
->setFrom('MyStateDataObject')
->setGroupBy('State');
$states = array();
foreach ($query->execute() as $row) {
$states[$row['ID']] = $row['State'];
}