如何按函数结果对 DataList 进行排序 - SilverStripe 4

How do I sort DataList by result of function - SilverStripe 4

我有一组对象 Person,我想根据对象 Score().

上的函数计算的分数对其进行排序

虽然我可以在 ModelAdmin 中轻松显示 Score(),但我无法按该字段排序,因为它不是数据库字段。分数每天都会根据数据库中的其他一些字段而变化,因此它不适合自己存储。

我怀疑会有一个与 filterByCallback() 等价的函数,例如 sortByCallback(),但我似乎找不到它。

我不需要将它添加到 ModelAdmin gridField 中,但我想在报告中使用它。其他人是如何解决这个问题的?

干杯

您始终可以使用本机 PHP 方法进行排序。例如

$list = Person::get()->toArray();
usort($list, function($a, $b){
    // will sort in descending order. To reverse, swap $b and $a
    return $b->Score() - $a->Score();
});

如果需要,您仍然可以转换为 ArrayList:

ArrayList::create($list);

正如 UncleCheese 在他的评论中指出的那样,这可能非常缓慢并且占用大量内存……这实际上取决于您计划排序的记录数。