Silverstripe - 不同的下拉字段

Cra*_*aig 1 php distinct silverstripe dropdown

我正在尝试使用数据对象中的州/省填充下拉列表,但有许多记录具有相同的状态。我怎样才能只显示不同的状态?

这将返回不同的状态:

$states= DataObject::get()->distinct(true)->column('State');
Run Code Online (Sandbox Code Playgroud)

这在我的下拉列表中显示为不同的值:

DropdownField::create('State', 'State', $states)
                    ->setEmptyString('(Select one)'),
Run Code Online (Sandbox Code Playgroud)

但这仅将下拉列表中的值显示为状态,而不将 ID 显示为状态。我怎样才能填充ID?

当我将它们添加到数组时它不喜欢它。

小智 5

您可以使用SS_Mapand array_unique()。它不像手动构建数据库查询那样有效,但它可以很好地完成工作并且不会成为问题,除非您有数千行。

$statesMap = MyStateDataObject::get()->map('ID', 'State');
$states = array_unique($statesMap->toArray());
$field = DropdownField::create('State', 'State', $states);
Run Code Online (Sandbox Code Playgroud)

另一种方法是构建一个数据库查询来执行此操作,例如:

$query = SQLSelect::create()
    ->setSelect(array('ID', 'State'))
    ->setFrom('MyStateDataObject')
    ->setGroupBy('State');

$states = array();
foreach ($query->execute() as $row) {
    $states[$row['ID']] = $row['State'];
}
Run Code Online (Sandbox Code Playgroud)