【问题标题】:How do I sort DataList by result of function - SilverStripe 4如何按函数结果对 DataList 进行排序 - SilverStripe 4
【发布时间】:2017-12-05 23:06:00
【问题描述】:

我有一组对象Person,我想根据对象Score() 上的函数计算的分数对其进行排序。

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

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

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

干杯

【问题讨论】:

  • 在内存中进行这些计算是非常糟糕的做法。每次这些事情发生变化时,将所有有助于Score() 计算的东西都纳入并确保使用新的原生Score db 字段编写Person 对您来说有多现实?仅仅因为它是一个计算值并不意味着它不能存储为数据。最坏的情况,你把它交给一个 cron 任务或其他东西。
  • 是的,我没有考虑过内存方面的问题——它会每天更新,或者在管理员中更改值时更新。所以是的,可能最好在午夜之后运行一个 cron 作业并进行任何更改。基本上是一个等待名单,查看他们已经等待了多少天以及他们的优先级,并据此分配分数。

标签: sorting silverstripe silverstripe-4


【解决方案1】:

您始终可以使用原生 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 在他的评论中指出的那样,这可能会非常缓慢并且占用大量内存……这实际上取决于您计划对多少条记录进行排序。

【讨论】:

    猜你喜欢
    • 2017-08-28
    • 2018-07-25
    • 1970-01-01
    • 2016-01-06
    • 2011-09-28
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多