我正在构建一个评级系统,用户可以在其中对某项进行 1-5 星评级。
我想知道是否有一种方法可以在 afterSave
或类似的东西上自动计算所有特定项目的评级(从 model='x' 和 foreign_key='y' 的评级表)。
我可以在 ratings_controller 中很好地完成它...只是认为在模型中自动完成可能更理想。谁能为此指出正确的方向?
我很想知道 CakePHP 中有某种关联设置允许它为您执行此操作 - 例如:
//Rating model
var $belongsTo = array(
'Restaurant' => array(
'averageValue' => 'rating
)
);
但是 - 我敢肯定这要求很多 :)
最佳答案
如果您想将平均值保存到项目表中的一个字段中,那么 afterSave 可能是目前最好的解决方案。
cake 唯一可以自动为您做的是跟踪一个项目有多少评级(counterCache),但不是其他聚合函数。
virtualField 可能不错,但我从未将其用于聚合函数,所以我不确定。此外,如果您的评分不经常更改,则会给系统带来不必要的工作。
在评分模型中:
function afterSave($created){ $avgValue = $this->Query('SELECT AVG(rating) as rating FROM ratings WHERE ratings.restaurant_id = '.$this->restaurant_id); $this->Restaurant->updateRatingAverage($this->restaurant_id,$avgValue[0][0]['rating']); }
在餐厅模型中
function updateRatingAverage($id,$avg){ $this->id = $id; $this->field('your_average_field_here',$avg); }
您可能想记录 $avgValue 以查看它的结构,但我认为我做对了。
关于mysql - 在 CakePHP 中计算新的平均 afterSave(或更好的东西?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6809024/