mysql - 在 CakePHP 中计算新的平均 afterSave(或更好的东西?)

标签 mysql cakephp cakephp-1.3 rating-system

我正在构建一个评级系统,用户可以在其中对某项进行 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/

相关文章:

Javascript-CSS 显示和隐藏表单元素

mysql - 将两列分组,对另一列中的相应值进行计数,并将计数放入两列中

sql - 在删除之前检查 SQL 中的完整性约束冲突

Cakephp 2 - 检查用户是否登录 View

php - 如何在 CakePHP 中通过 Ajax 处理类似测验游戏的表单/数据?

php - 在 CakePHP 中将变量从 View 传递到布局 - 或者将此逻辑放在哪里?

php - 如何在 PHP 中以正确的方式获取计数 (*)

php - 使用 Set 使用散列和日期加载数据本地文件

cakephp 2.x 带有模型但没有数据库的表单验证

timer - CakePHP 1.3 : Measuring Page Execution Time