我正在建立一个评分系统,用户可以从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/

10-11 12:19