如何按函数结果对 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 在他的评论中指出的那样,这可能非常缓慢并且占用大量内存……这实际上取决于您计划排序的记录数。
我有一组对象 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 在他的评论中指出的那样,这可能非常缓慢并且占用大量内存……这实际上取决于您计划排序的记录数。