Модель CakePHP: КОЛИЧЕСТВО (*) в Containable

Я имею приложение CakePHP 1.3 и действительно наслаждаюсь поведением Containable для выбирающих данных.

Давайте предположим, что у меня есть Сообщения в связи "один ко многим" с Комментариями. Я использую Containable для запросов (для разбиения на страницы) списка всех Сообщений и принадлежащих Комментариев. Но я только интересуюсь тем, сколько Комментариев каждое Сообщение имеет. Я не сделал нашел любой способ достигнуть этого запроса с containable, не выбирая все строки Комментариев. Я попробовал:

$this->paginate=array(
            'fields' => 'Post.title, Post.created',
            'contain' => array('Comment'=>'COUNT(*) AS count'),
        );

результаты в 'Модели "Комментарий" не связаны с моделью "Count"' сообщение об ошибке.

$this->paginate=array(
            'fields' => array('Post.title, Post.created'),
            'contain' => array('Comment'=>array('fields'=>'COUNT(*) AS count'),
        );

не работает, набор результатов содержит для каждого Сообщения пустой массив Комментария за исключением последнего, где это содержит поле количества, но наличие количества всех комментариев не только принадлежащие.

Мое другое предположение было

$this->paginate=array(
            'fields' => 'Post.title, Post.created, COUNT(Comment.id)',
            'contain' => array('Comment'=>array('fields'=>''),
        );

но это приводит к ошибке, потому что hasMany отношения запрашиваются независимо, таким образом, таблица Answer не находится в запросе для записей Сообщения. Как я могу считать количество Комментариев, которые имеет Сообщение?

12
задан sibidiba 22 February 2010 в 00:18
поделиться

1 ответ

Что ж, лучший способ сделать это - настроить поле с именем comment_count в таблице posts и добавить этот ключ в модель комментариев $ ownTo Post array:

'counterCache' => true

Каждый раз, когда с комментариями что-то происходит, поле comment_count в соответствующем посте будет обновляться (фактически, оно пересчитывается каждый раз, а не просто добавляется или удаляется).

Это лучше, потому что, когда вы получаете данные для пользователя, это происходит быстрее и даже не касается таблицы комментариев. Поскольку вы используете поведение Containable, я думаю, что скорость и легкий вес - это то, что вы ищете.

11
ответ дан 2 December 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: