0

SO と同様に、自分のサイトに評判システムを組み込むことに取り組んでいます。構造は次のとおりです。

ユーザー hasMany プロジェクトユーザー hasMany
回答
プロジェクト hasMany 評価
回答 hasMany 評価
評価が属するプロジェクト

評価の値フィールドは 1 ~ 5 の数値になります。ユーザーは、5 つ星のレビューごとに +10、4 つ星のレビューごとに +5、3 つ星のレビューごとに +1 を獲得する必要があります。私が現在セットアップしている方法は次のとおりです。UsersController の recalcRep($id) アクション (必要に応じて他のコントローラーの他のアクションと共に) は、User モデル内の calcRep($id) メソッドを呼び出します。 $id の ID を持つユーザーの評判を計算します。

public function calcRep($id) {
        $rep = 0;

        $data = $this->Rating->find('all'); //does not work, because it is not directly associated
        foreach($data as $rating) {
            if(($rating['Rating']['parent_type'] == 'Project' && $rating['Project']['user_id']==$id) or ($rating['Rating']['parent_type'] == 'Answer' && $rating['Answer']['user_id']==$id)) {
                if($rating['Rating']['value']==5) {
                    $rep += 10;
                } else if($rating['Rating']['value']==4) {
                    $rep += 5;
                } else if($rating['Rating']['value']==3) {
                    $rep += 2;
                }
            }
        }
        $data['User']['reputation'] = $rep;
        $this->save($data);
    }

私はこれに完全に間違った方法でアプローチしている可能性がありますが、特定のユーザーの子供に属するすべての評価を見つける方法がわかりません。

4

1 に答える 1

0

コントローラーからモデル定義を呼び出す場合、コントローラー名はモデルと同じである必要があります。たとえば、呼び出しているので、$this->Ratingそれを呼び出すクラスは次のようにRatingControllerなります。 。あなたの最善の策は、find('all')あなたの内部を呼び出してRatingController、あなたが渡す一時変数にそれを保存することですcalcRep()

<?php
class RatingsController extends AppController {
    function calcRep($id) {
        $rep = 0;

        $data = $this->Rating->find('all'); //should work now, as you're calling it from the defined controller
        foreach($data as $rating) {
            if(($rating['Rating']['parent_type'] == 'Project' && $rating['Project']['user_id']==$id) or ($rating['Rating']['parent_type'] == 'Answer' && $rating['Answer']['user_id']==$id)) {
                if($rating['Rating']['value']==5) {
                    $rep += 10;
                } else if($rating['Rating']['value']==4) {
                    $rep += 5;
                } else if($rating['Rating']['value']==3) {
                    $rep += 2;
                }
            }
        }
        $data['User']['reputation'] = $rep;
        $this->save($data);
    }

}

?>

機能もあると思いloadModel()ますか?おそらく、loadModel('Rating')事前にそれが機能する場合。

ただし、cakePHPのPHP解釈モデルでは、モデル内でこれを実行できないようです。これは、実行しようとしていることがコントローラーに最適であるためです。

于 2012-05-05T00:21:37.000 に答える