2012-05-04 89 views
0

我正在將聲譽系統整合到我的網站中,類似於SO。下面是它的結構:如何使用這種間接關係?

用戶的hasMany項目
用戶的hasMany回答
項目的hasMany評級
回答的hasMany評級
評級屬於關聯項目,其中Rating.parent_type =項目
評級屬於關聯答案在Rating.parent_type =回答

評分值字段將是介於1和5之間的數字。每5星評價用戶應該獲得+10,每4星評價獲得+5,每三星評價獲得+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); 
    } 

我可以在完全錯誤的方式來處理這個,但我無法弄清楚如何找到屬於任何特定用戶的孩子的所有評級。

回答

0

我認爲CakePHP的要求,如果你打算從控制器調用模型定義,控制器名稱必須是一樣的模型,如因爲你調用$this->Rating,類調用它需要是RatingController或類似的東西。最好的辦法是打電話給你RatingControllerfind('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解釋模型並不允許您在模型中執行此操作,因爲您正在嘗試執行的操作非常適合控制器。

+0

然後,似乎我會遇到更多的問題。我希望得到的結果是聲譽值被緩存在用戶表中的「聲譽」字段中。此外,最終收視率不會是影響聲譽的唯一因素,因此將它存儲在用戶中似乎更有意義。 – tyjkenn

+0

你仍然在這裏操縱數據,所以它應該在控制器中。如果您想要從評級表中獲取信息,對其進行操作並將其存儲在用戶表中,然後將用戶加載到您要調用此用戶的Controller內。它必須是控制器,或者必須先加載模型。你應該可以調用'$ this-> loadModel('User');'然後'$ this-> User-> save($ data);'如果你想把它存儲在User表中 –