我正在建立一个评分系统,用户可以从1-5星级评分。
我想知道是否有一种方法可以自动计算某个特定项目在afterSave
上的所有评分(从model='x'和foreign='y'的评分表中)。
我可以在收视率控制器里做的很好。。。只是觉得在模型中自动完成可能更理想。有人能为我指出正确的方向吗?
我很高兴听到CakePHP中有某种关联设置,允许它为您执行此操作,例如:
//Rating model
var $belongsTo = array(
'Restaurant' => array(
'averageValue' => 'rating
)
);
但是-我相信这要求很多:)
最佳答案
如果要将平均值保存到items表的字段中,那么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/