【问题标题】:Calculate new average afterSave (or something better?) in CakePHP在 CakePHP 中计算新的平均值 afterSave(或更好的?)
【发布时间】:2011-10-12 03:33:50
【问题描述】:

我正在构建一个评分系统,用户可以在其中评分 1-5 星。

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

我可以在 rating_controller 中很好地完成...只是认为在模型中自动完成可能更理想。谁能指出我正确的方向?

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

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

但是 - 我敢肯定这要求很高:)

【问题讨论】:

    标签: mysql cakephp cakephp-1.3 rating-system


    【解决方案1】:

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

    【讨论】:

    • 有没有机会给我提示一下我将使用的代码?我是模型函数的新手,不确定如何在 Rating 模型中更新不同模型的字段。
    • 酷 - 这似乎是我正在寻找的,谢谢。唯一的缺点是,如果我想允许对餐厅以外的其他事物进行评论,他们每个人都必须有自己的函数来计算平均值,而不是在添加新评级时在评级控制器中进行。听起来我可能会坚持我原来的计划。
    • 你在控制器中做得如何?我不知道你还需要什么,所以这只是餐厅的一个例子。
    【解决方案2】:

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

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

    【讨论】:

    • 是的 - restaurant hasMany rating。如果我使用 virtualField,每次我获取餐厅的数据时都必须进行 AVG 计算(超过数万个评分),而不是在添加新评分并获得 Restaurant.rating 字段时计算它.似乎不太理想。保存评分后,我可以在控制器中很好地进行计算 - 只是认为可能有某种蛋糕方式可以更好/以更理想的方式做得更好。
    • @Dave:注释(来自一个对 Cake 不太了解的人):“如果您使用 virtualField,则每次获取数据时都必须进行 AVG 计算餐厅。” 没错,但数据库可能不一定需要进行任何实际计算,因为查询可能在缓存中。如果你连续 10 次询问评分,它只会计算一次(当评分数据没有变化并且查询没有从数据库缓存中删除时)。
    • ... “而不是在每次添加新评分并获取 Restaurant.rating 字段时计算它” 正确,这也意味着您将进行计算不管你是否需要。在评级数据在短时间内发生大量添加的情况下,您将对每次添加(afterSave)进行新的计算,而在所有添加完成后您可能只需要最后一次(计算)。
    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多