2017-12-05 25 views
1

私はオブジェクトScore()の関数で計算されたスコアに基づいてソートしたいオブジェクトのセットPersonを持っています。関数の結果でデータリストをソートする方法 - SilverStripe 4

ModelAdminにScore()を簡単に表示することはできますが、dbフィールドではないので、そのフィールドでソートすることはできません。スコアは毎日dbの他のいくつかのフィールドに基づいて変化するので、それ自体を格納するのに適したものではありません。

filterByCallback()の類義語であるsortByCallback()のような機能があると思っていましたが、それが存在しないようです。

ModelAdmin gridFieldに追加する必要はありませんが、レポートに使用したいと思います。他の人がこの問題をどうやって解決したのか?

乾杯

+0

メモリ内でこの種の計算を行うことは、実際には悪いことです。 'Score()'計算に寄与するすべてのものを取って、それらのうちの1つが変更されるたびに 'Person'が新しいネイティブ' Score' dbフィールドで書き込まれるようにすることは、現実的でしょうか?それが計算された値であるからといって、データとして保存することはできません。最悪の場合は、それをcronタスクなどに渡します。 – UncleCheese

+0

本当に、私はメモリの面については考えていませんでした。毎日更新されるか、管理者の値が変更されたときに更新されます。ですから、真夜中や変更の直後にcronジョブを実行する方がよいでしょう。基本的には、待機していた日数と優先度を調べ、それに基づいてスコアを割り当てる待機リストです。 – howardgrigg

答えて

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が彼のコメントで指摘したように、これは非常に遅く、メモリ集約することができます...それは本当にどのように依存あなたが並べ替える予定の多くのレコード。

関連する問題