К основному контенту

Pagination в CakePHP 1.2. Небольшая хитрость

Этот пост устарел! Читайте по ссылке исправленную и сильно переработанную версию!

This is totally outdated article! Follow the link to see a more complete version! Sorry. The newwer post in russian too.

Как уже писал, Containable behaivior, который отлично справляется с задачей выборки только нужных для данного действия (action). И при небольшой модификации отлично работает с методом pagination. Однако есть одна неприятная вещь, опять же связанная с тем, что pagination вызывает последовательно 2 метода модели — сначала для подсчета количества записей, а потом для выборки.

При попытке подсчитать количество записей у модели с большим количеством связей, paginator делает SQL запрос SELECT COUNT(*) со всеми положенными JOIN'ами, что при больших объемах данных существенно увеличивает время выполнения запроса. Особенно, если при этом еще и сортировку делать надо. Этот факт сильно раздражает, если в итоге нужно всего-лишь количество записей в основной модели.

Выход есть. Разглядывая код метода paginate, обнаружил, что Cake пытается сначала вызвать метод paginateCount, а если его нет, то вызывает findCount.

Ура! Определяем в модели метод paginateCount:


function paginateCount($conditions, $recursive)
{
  return $this->findCount($conditions, -1);
}

и готово!

Теперь paginate считает записи только в нужной нам модели, не вызывая JOIN'ов, а возвращает записи со всеми нужными дополнительными данными.

Популярные сообщения из этого блога

Sitemap для Shop-Script

С недавних пор наш национальный поисковик присоединился к славной компании поисковиков, умеющих обрабатывать файлы sitemap . Наверное, это связано с какими-то общеланетарными амбициями. Как бы то ни было, теперь есть возможность скормить Яндексу файл(ы) sitemap . Я решил, что обрабатывать сайт какой-нибудь сторонней приблудой много дольше, чем просто сгенерировать файлы sitemap с помощью скрипта. Тем более, что у shop-script в общем-то довольно простая структура. Новая версия Shop-Script с ЧПУ пока недоступна, получу — модифицирую скрипт. :-) Скрипт простенький, делает sitemap для aux-страниц — это у shop-script так называются обычные статические html страницы; страниц с категориями. Без разбивки на страницы 1, 2 и т.д. на мой взгляд эти страницы не слишком важны страниц с товарами и обсуждениями товаров Можно запускать из браузера, можно по cron’у. Корневую страницу сайта, страницу с новостями, страницу с формой обратной связи и т.п. надо записать в отдельный файл sitemap ...

Набережные

На бывшей доске почета, а ныне просто небольшой фотовыставке достижений Московского Судостроительного и Судоремонтного Завода (МССЗ) увидел пару интересных фотографий продукции этого завода на фоне набережных Москвы. Вот только сами набережные и годы съемки определить не смог. :) Знатоки подсказывают: первая фотография: Гончарная набережная у м.Таганская ; вторая: Фрунзенская набережная дом 34-32-26 .

Зеленые облака

Сегодня часов около 12 дня бежал по делам рядом со станцией метро Юго-Западная и обратил внимание на странный цвет неба. Поскольку прямо по курсу, километрах в трех-четырех находится железнодорожная станция "Очаково", решил, что там авария какая-нибудь. "Хлор или иприт" - внезапно промелькнула мысль. Странно, уроки НВП я, большей частью, прогуливал... Позже в Интернете прочел, что это сильный ветер поднял в воздух большое количество пыльцы. Сделал фотографию на планшет, убедился, что получилось плохо - цвета почти видно, и, так как торопился, не стал дальше заморачиваться. Вот сейчас еду в метро домой, попробовал немного задрать контраст и насыщенность. Может, получится чего.