0

我正在努力将声誉系统整合到我的网站中,类似于 SO。以下是它的结构:

User hasMany Project
User hasMany Answer
Project hasMany Rating
Answer hasMany Rating
Rating belongsTo Project where Rating.parent_type = Project
Rating belongsTo Answer where Rating.parent_type = Answer

评级的值字段将是一个介于 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

我认为 cakePHP 要求如果你要从控制器调用模型定义,控制器名称必须与模型相同,因为你正在调用$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 回答