2009-12-24 4 views
3

Я работаю над представлением для блога, в котором размещаются сообщения в блогах, комментарии и загружаемые элементы мультимедиа в один большой макет сетки. Я настроил отдельные модели в CakePHP и ассоциации, некоторые из которых являются следующие:Разбиение нескольких моделей в CakePHP 1.2.5

Comment BelongsTo Post or Media 
Post HasMany Media 

То, что я работаю с пытается сортировать все три модели (Comment, Media, Post) в один большой массив данных который я могу затем разбивать на страницы.

У меня есть уже созданное поле datetime в базе данных. Я понимаю, как разбивать каждый отдельный вызов базы данных с помощью CakePHP PaginationHelper. Я также объединил массивы. Однако смешивание отдельных запросов к базе данных и последующее объединение массивов, похоже, разбивают разбивку на страницы, так как она не работает с PaginationHelper (как я понимаю).

У вас есть предложения по этому поводу?

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

~ Эндрю

ответ

5

Это звучит, как вы хотите использовать какой-то UNION выбрать в отношении этих 3 моделей. Вы можете добиться этого, переопределив модели paginate и paginateCount по умолчанию. Основы описаны в Книге поваров (http://book.cakephp.org/view/249/Custom-Query-Pagination).

Это звучит, как вы хотите, чтобы заменить находку (все) с находкой («запроса») следующим образом:

/** 
* Overridden paginate method - group by week, away_team_id and home_team_id 
*/ 
function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()) { 
    $recursive = -1; 
    $group = $fields = array('week', 'away_team_id', 'home_team_id'); 
    return $this->query('SELECT field1, field2 FROM table1 
         UNION SELECT field1, field2 FROM table2 
         LIMIT '.(($page-1)*$limit).', '.$limit); 
} 
+0

Это сделал это! Огромное спасибо. –

+0

Нет проблем вообще :) – spelley