我正在將聲譽系統整合到我的網站中,類似於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);
}
我可以在完全錯誤的方式來處理這個,但我無法弄清楚如何找到屬於任何特定用戶的孩子的所有評級。
然後,似乎我會遇到更多的問題。我希望得到的結果是聲譽值被緩存在用戶表中的「聲譽」字段中。此外,最終收視率不會是影響聲譽的唯一因素,因此將它存儲在用戶中似乎更有意義。 – tyjkenn
你仍然在這裏操縱數據,所以它應該在控制器中。如果您想要從評級表中獲取信息,對其進行操作並將其存儲在用戶表中,然後將用戶加載到您要調用此用戶的Controller內。它必須是控制器,或者必須先加載模型。你應該可以調用'$ this-> loadModel('User');'然後'$ this-> User-> save($ data);'如果你想把它存儲在User表中 –