1

我正在建立一个评级系统,用户可以在其中对 1-5 星的内容进行评级。

我想知道是否有一种方法可以自动计算所有特定项目的评级(来自模型 ='x' 和 foreign_key ='y' 的评级表)afterSave或类似的东西。

我可以在 rating_controller 中做到这一点......只是认为在模型中自动完成可能更理想。谁能指出我正确的方向?

我很想听到 CakePHP 中有某种关联设置允许它为您执行此操作 - 例如:

//Rating model
var $belongsTo = array(
    'Restaurant' => array(
        'averageValue' => 'rating
    )
);

但是 - 我敢肯定这要求太多了:)

4

2 回答 2

2

如果您想将平均值保存到 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 以查看其结构,但我认为我做对了。

于 2011-07-24T20:19:35.157 回答
1

我需要发布和回答,因为我还不能发表评论。

那么,您的(例如)餐厅有很多评分吗?尝试在餐厅模型中使用 virtualField,您可以在每次从数据库中获取餐厅时计算评分。如果您需要使用 AVG(),可能需要像提到的 ypercube 那样的 GROUP BY。

于 2011-07-24T19:56:57.313 回答