Я имею приложение 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 не находится в запросе для записей Сообщения. Как я могу считать количество Комментариев, которые имеет Сообщение?
Что ж, лучший способ сделать это - настроить поле с именем comment_count
в таблице posts
и добавить этот ключ в модель комментариев $ ownTo Post array:
'counterCache' => true
Каждый раз, когда с комментариями что-то происходит, поле comment_count в соответствующем посте будет обновляться (фактически, оно пересчитывается каждый раз, а не просто добавляется или удаляется).
Это лучше, потому что, когда вы получаете данные для пользователя, это происходит быстрее и даже не касается таблицы комментариев. Поскольку вы используете поведение Containable, я думаю, что скорость и легкий вес - это то, что вы ищете.