<?php
private function getPosts($catid, $page=1){
$criteria = new CDbCriteria; // объект критериев выборки из БД
// Объект пагинации и кол-во постов
$pages = new CPagination(Post::model()->count($criteria));
$pages->pageSize = 20; // Кол-во постов на страницу
$pages->applyLimit($criteria); // Прикручиваем к запросу наши критерии
// Вся магия здесь:
$posts = Post::model()->findAll($criteria);
}
То есть нам не надо будет вычислять пределы для LIMIT, исходя из номера страницы и кол-ва постов на каждой. Все это сделает за нас фреймворк.
Примечание: AR не дает решения для всех задач, касающихся работы с базами данных. Лучше всего его использовать для моделирования таблиц в конструкциях PHP и для несложных SQL-запросов. Для сложных случаев следует использовать Yii DAO.
Ну на самом деле не обязательно что джоин из 10 таблиц будет работать быстрее. Скорее как раз наоборот. В случае с 2-3 - это да. Но фишка в том, что надо просто учитывать, что важнее в ДАННОМ запросе - скорость работы или скорость разработки.
У меня в проекте делается сложный поиск. Понятное дело, что через актив рекорд я его не делаю, но через 5 джоинов - тоже неправильно. Самый эффективный вариант оказался искать ID продуктов, а потом выбирать через IN(). AR делает точно так же.
ИТОГО: Если таблицы большие (больше 50 000 записей), а объединений больше 3х, то при включенном кешировании схемы таблицы AR не будет отставать от джоинов, зато будет давать большее удобство.