1

多くの投票を持つモデル Track があります。Vote モデルには「value」というフィールドがあります。私がやりたいことは、投票の値の合計でトラック レコードを並べ替えることです (つまり、残念ながら counterCache を使用できません)。

もちろん、'order'=>'SUM(Vote.value)'「unknown column...」というエラーで失敗します。

find('all') ですべてを取得し、後で並べ替えるだけですが、ページネーションも必要です。

私が思いついた最良のアイデアは、すべての投票の合計値を追跡する Track モデルにフィールドを追加することです。counterCache が行うことと似ていますが、さまざまな投票の異なる値を反映します。

これを行う簡単な方法はありますか?

読んでくれてありがとう!

4

1 に答える 1

0

さて、最終的に Track モデルに列 ("vote_score") を追加し、投票が追加/削除されたときにそれを更新しました。誰かが興味を持っている場合に備えて、ここにコードがあります。動作しているように見えますが、広範囲にテストしていません。投票モデルでは:

public function afterSave(){
    $this->Track->id = $this->data['Vote']['track_id'];
    $this->Track->saveField('vote_score','vote_score' + $this->data['Vote']['value']);
}

public function beforeDelete(){
    $vote = $this->Vote->read();
    $this->Track->id = $vote['Vote']['track_id'];
    $this->Track->saveField('vote_score','vote_score' - $vote['Vote']['value']);
    return true;
}
于 2011-08-17T17:24:45.797 に答える