1

ユーザーが 1 ~ 5 の星で何かを評価できる評価システムを構築しています。

特定のアイテムのすべての評価を (model='x' およびforeign_key='y' の評価テーブルから) 自動的に計算する方法があるかどうか疑問に思っていましたafterSave

rating_controller で問題なく実行できます...モデルで自動的に実行する方が理想的かもしれないと思いました。誰かが私を正しい方向に向けることができますか?

これを可能にする何らかの関連付け設定が CakePHP にあると聞いてみたいです。

//Rating model
var $belongsTo = array(
    'Restaurant' => array(
        'averageValue' => 'rating
    )
);

しかし、それは多くのことを求めていると確信しています:)

4

2 に答える 2

2

平均を項目テーブルのフィールドに保存したい場合は、 afterSave がおそらく最善の解決策です。

Cake が自動的にできることは、項目の評価数 (counterCache) を追跡することだけですが、他の集計関数はできません。

virtualField は良いかもしれませんが、集計関数に使用したことがないため、よくわかりません。さらに、レーティングが頻繁に変更されない場合、システムに不要な作業が発生します。

評価モデル:

function afterSave($created){
   $avgValue = $this->Query('SELECT AVG(rating) as rating FROM ratings WHERE ratings.restaurant_id = '.$this->restaurant_id);
   $this->Restaurant->updateRatingAverage($this->restaurant_id,$avgValue[0][0]['rating']);
}

レストランモデルで

function updateRatingAverage($id,$avg){  
   $this->id = $id;
   $this->field('your_average_field_here',$avg);
}

$avgValue をログに記録して、それがどのように構成されているかを確認することもできますが、それは正しいと思います。

于 2011-07-24T20:19:35.157 に答える
1

まだコメントできないので、投稿して返信する必要があります。

それで、あなたの(たとえば)レストランには多くの評価がありますか?レストランがデータベースから取得されるたびに評価を計算するレストラン モデルで virtualField を試してください。AVG() を使用する必要がある場合は、前述の ypercube のような GROUP BY が必要になる場合があります。

于 2011-07-24T19:56:57.313 に答える