Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Orm 我如何使用这种间接关系?_Orm_Relationship_Cakephp 2.1 - Fatal编程技术网

Orm 我如何使用这种间接关系?

Orm 我如何使用这种间接关系?,orm,relationship,cakephp-2.1,Orm,Relationship,Cakephp 2.1,我正在努力将一个声誉系统整合到我的网站中,类似于这样。以下是它的结构: 用户有许多项目 用户有很多答案 项目有很多评级 答案有很多评分 评级属于项目,其中Rating.parent\u type=项目 Rating belong回答Rating.parent\u type=答案 评级的值字段将是一个介于1和5之间的数字。用户每五星级评论应获得+10,每四星级评论应获得+5,每三星级评论应获得+1。我目前的设置方式是:UsersController中的recalcRep($id)操作(必要时与其他

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

用户有许多项目
用户有很多答案
项目有很多评级
答案有很多评分
评级属于项目,其中Rating.parent\u type=项目
Rating belong回答Rating.parent\u type=答案

评级的值字段将是一个介于1和5之间的数字。用户每五星级评论应获得+10,每四星级评论应获得+5,每三星级评论应获得+1。我目前的设置方式是:UsersController中的recalcRep($id)操作(必要时与其他控制器中的其他操作一起)调用用户模型中的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);
    }

我可能以完全错误的方式处理这个问题,但我不知道如何找到属于特定用户的任何子级的所有评级。

我认为cakePHP要求,如果要从控制器调用模型定义,控制器名称必须与模型相同,因为您正在调用
$this->Rating
,调用它的类必须是
RatingController
或类似的东西。最好的方法是调用
RatingController中的
find('all')
,并将其存储在传递给
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);
    }

}

?>

那么我似乎会遇到更多的问题。我希望结果是信誉值缓存在用户表的“信誉”字段中。此外,最终评级不会是影响声誉的唯一因素,因此将其存储在用户中似乎更有意义。您仍然在这里操作数据,因此它应该在控制器中。如果您想从评级表中获取信息,对其进行操作,并将其存储在用户表中,然后将用户加载到从中调用此功能的控制器中。它必须是控制器,或者您必须首先加载模型。您应该能够调用
$this->loadModel('User')
然后
$this->User->save($data)如果要将其存储在用户表中