【问题标题】:How do I use this indirect relationship?我如何使用这种间接关系?
【发布时间】:2012-06-17 05:12:18
【问题描述】:

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

用户拥有多个项目
用户有很多答案
项目有很多评分
答案有很多评分
评级属于项目,其中 Rating.parent_type = 项目
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);
    }

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

【问题讨论】:

    标签: orm relationship cakephp-2.1


    【解决方案1】:

    我认为 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);
        }
    
    }
    
    ?>
    

    我相信还有loadModel()函数?也许如果你事先loadModel('Rating') 它会起作用。

    似乎 cakePHP 的 PHP 解释模型不允许您在模型内部执行此操作,因为您尝试做的事情非常适合控制器。

    【讨论】:

    • 那么看来我会遇到更多问题。我希望结果是信誉值缓存在用户表的“信誉”字段中。此外,最终评级不会是影响声誉的唯一因素,因此将其存储在 User 中似乎更有意义。
    • 你仍然在这里操作数据,所以它应该在控制器中。如果您想从评级表中获取信息,对其进行操作并将其存储在 User 表中,然后将 User 加载到您从中调用它的 Controller 中。它必须是控制器,否则您必须先加载模型。如果您想将其存储在 User 表中,您应该可以调用 $this-&gt;loadModel('User');$this-&gt;User-&gt;save($data);
    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 2014-05-08
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多