counterCache in cake php

时间:2009-08-29 16:26:39

标签: php cakephp

我想在博客中显示特定帖子的评论总数。我的数据库中有'posts'和'comments'表。现在,我对使用counterCache感到有点困惑。 我首先在'posts database'中创建了一个字段,即'comment_count'然后我在post模型中添加了counterCache键。

var $hasMany = array('Comment'=>array('counterCache'=>true));

但这不起作用。我也尝试过反过来,即在cooments表中创建一个字段并将counterCache键添加到模型中。但这也没有用。 我在这里缺少什么?我可以使用find('count')显示注释的数量吗?或者还有其他方法可以达到这个目的吗?

5 个答案:

答案 0 :(得分:4)

您确定正确使用counterCache吗? counterCache和您自己的解决方案有些无关。

  

3.7.4.1.1 counterCache - Cache your count()

     

此功能可帮助您缓存相关数据的计数。模型本身不会通过find('count')手动计算记录,而是跟踪对关联的$ hasMany模型的任何添加/删除,并增加/减少父模型表中的专用整数字段。

     

...

class Image extends AppModel {
    var $belongsTo = array(
        'ImageAlbum' => array('counterCache' => true)
    );
}
     

从现在开始,每次添加或删除与ImageAlbum相关联的图片时,ImageAlbum.image_count内的数字都会自动调整。

换句话说,它的设计使您必须手动$this->Model->find('count'),并且只有在添加或删除条目时才会更改。在您的情况下,您应该在Post模型中添加comment_count字段(就像您一样),但在Comment模型中指定belongsTo => Post, counterCache => true。原因是每当 Comment 模型更改(添加/删除)时,它必须更新Post模型中的counterCache

希望有所帮助。

答案 1 :(得分:0)

您正在以正确的方式使用counterCache。但是尝试清除/ app / tmp / cache /

中的所有文件(不是目录!)

答案 2 :(得分:0)

我认为counterCache不能用于$hasMany关系,只能在$belongsTo上使用。

答案 3 :(得分:0)

有没有办法为现有数据初始化CounterCache?我重构我的代码以使用它,实际上如果我插入记录它会更新数据,但在此之前它显示0将破坏其他功能。 我想过编写一个脚本来完成工作,但是想到可能有一个技巧?

答案 4 :(得分:-6)

伙计们,我明白了。在posts控制器的view操作中编写以下代码,设置它然后在视图文件中回显它。完美运作

$counts = $this->Post->Comment
>find('count',array('conditions'=>array('Comment.post_id'=>$post['Post']['id'])));