вторник, 15 марта 2011 г.

CakePhp - Деление на страницы при модели данных многие ко многим - cakephp paginate habtm

Пока приложение на cakePhp простое у начинающих разработчиков не так много вопросов, но при увеличении сложности приложения часто возникают достаточно очевидные вопросы и, к сожалению, документация cakePhp часто не дает на них ответов.

Я внесу свои пять копеек в одну из часто поднимаемых тем - деление контента на страницы при модели данных, содержащей связи многие ко многим (HABTM).

Для того, чтобы все заработало как надо поправим в код в контроллере:

(я использую вызов метода paginate в действиях контроллера)

Этот код я использую, чтобы получить все записи (stream), содержащие определенное ключевое слово (keyword).


$this -> paginate = array(
'Stream' => array(
'limit' => 10,
'joins' => array(
array(
'table' => 'keywords_streams',
'alias' => 'KeywordsStreams',
'type' => 'inner',
'conditions' => array(
'KeywordsStreams.stream_id = Stream.id'
)
),
array(
'table' => 'keywords',
'alias' => 'Keyword',
'type' => 'inner',
'conditions' => array(
'KeywordsStreams.keyword_id = Keyword.id',
'Keyword.id' => 100 // здесь необходимый id ключевого слова
)
)
)
)
);

$streams = $this -> paginate('Stream');
$this-> set(compact('streams'));

Стоит заметить, что, если вы используете префикс для таблиц в базе данных, cake не подставит этот префикс к именам таблиц, поэтому используйте полные названия таблиц ('table' => 'prefix_keywords_streams').

Более расширенный вариант:

$this -> paginate = array(
'Stream' => array(
'limit' => 50,
'order' => array(
'KeywordsStreams.count' => 'DESC',
'Stream.weight' => 'DESC'
),
'joins' => array(
array(
'table' => 'afisha_bot_keywords_streams',
'alias' => 'KeywordsStreams',
'type' => 'inner',
'conditions' => array(
'KeywordsStreams.stream_id = Stream.id',
'Stream.flag' => 1
)
),
array(
'table' => 'afisha_bot_keywords',
'alias' => 'Keyword',
'type' => 'inner',
'conditions' => array(
'KeywordsStreams.keyword_id = Keyword.id',
'Keyword.id' => $keyword_id
)
)
)
)
);

Ссылка на подробную статью (англ)