counterCache в торте php - PullRequest
       178

counterCache в торте php

2 голосов
/ 29 августа 2009

Я хочу отобразить общее количество комментариев для определенного поста в моем блоге. В моей базе данных есть таблицы «записи» и «комментарии». Теперь я немного запутался в использовании counterCache. Сначала я создал поле в базе данных записей, а именно comment_count, а затем добавил ключ counterCache в модель записей.

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

Но это не сработало. Я также попытался пойти другим путем, то есть путем создания поля в таблице Cooments и добавления ключа counterCache к модели. Но это тоже не сработало. Что мне здесь не хватает? Могу ли я отобразить количество комментариев, используя find ('count') ?? или есть другой способ добиться этого?

Ответы [ 5 ]

4 голосов
/ 30 августа 2009

Вы уверены, что используете counterCache правильно?counterCache и ваше собственное решение несколько не связаны.

3.7.4.1.1 counterCache - Кэшируйте ваш счетчик ()

Эта функция помогает вам кэшироватьколичество связанных данных.Вместо подсчета записей вручную с помощью find ('count'), сама модель отслеживает любое добавление / удаление по отношению к связанной модели $ hasMany и увеличивает / уменьшает выделенное целое поле в таблице родительской модели.

...

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

С этого момента каждый раз, когда вы добавляете или удаляете изображение, связанное с ImageAlbum, число в ImageAlbum.image_count настраивается автоматически.

Другими словами, эторазработано так, чтобы не приходилось $this->Model->find('count') вручную, и это изменится только при добавлении или удалении записей.В вашем случае вы должны добавить поле comment_count к вашей модели Post (как вы это сделали), но затем указать belongsTo => Post, counterCache => true в модели Comment.Причина в том, что всякий раз, когда модель Comment изменяется (добавляет / удаляет), она должна обновлять counterCache в модели Post.

Надеюсь, что это поможет.

0 голосов
/ 27 ноября 2014

Есть ли способ инициализировать CounterCache для существующих данных? Я реорганизую свой код, чтобы использовать его, и, действительно, если я вставлю запись, он обновит данные, но до тех пор пока он показывает 0, что нарушит другие функции. Я думал о написании сценария для выполнения работы, но подумал, что может быть хитрость?

0 голосов
/ 05 марта 2014

Я не думаю, что counterCache можно использовать для отношений $hasMany, только для $belongsTo.

0 голосов
/ 31 августа 2009

вы используете counterCache правильно. Но попробуйте очистить все файлы (не каталоги!) В / app / tmp / cache /

0 голосов
/ 30 августа 2009

Ребята, я разобрался. Напишите следующий код в действии view контроллера сообщений, установите его, а затем отобразите его в файле представления. Отлично работает

$counts = $this->Post->Comment
>find('count',array('conditions'=>array('Comment.post_id'=>$post['Post']['id'])));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...