Cоздание страницы CakePHP с помощью моделей HABTM

У меня возникли проблемы с созданием разбивки на страницы с помощью отношения HABTM. Во-первых, таблицы и отношения:

requests (id, to_location_id, from_location_id) locations (id, name) items_locations (id, item_id, location_id) items (id, name) 

Таким образом, у запроса есть местоположение, откуда поступает запрос, и местоположение, которое запрашивает запрос. По этому вопросу меня беспокоит только «местоположение».

 Request --belongsTo--> Location* --hasAndBelongsToMany--> Item (* as "ToLocation") 

В моем RequestController я хочу разбивать страницы на все элементы в ToLocation запроса.

 // RequestsController var $paginate = array( 'Item' => array( 'limit' => 5, 'contain' => array( "Location" ) ) ); // RequestController::add() $locationId = 21; $items = $this->paginate('Item', array( "Location.id" => $locationId )); 

И это не работает, потому что он генерирует этот SQL:

 SELECT COUNT(*) AS count FROM items Item WHERE Location.id = 21 

Я не могу понять, как заставить его на самом деле использовать аргумент «содержать» $paginate

Есть идеи?

после трехдневного поиска я нашел способ

 var $paginate = array('Post'=>array('group'=>'Post.id')); 

Рекомендуется добавить группу, потому что иногда мы будем получать дубликаты сообщений в разных категориях

 $this->Post->bindModel(array('hasOne'=>array('CategoriesPost')), false); $out = $this->paginate('Post', array('CategoriesPost.category_id'=>array(1,4,7,6))); 

Добавьте false для использования модели привязки ко всем запросам, а не только к следующей

Для разбиения на страницы HABTM вам необходимо временно привязать модель объединения «hasOne» к модели, которую вы разбиваете на страницы:

 // prepare to paginate Item $this->Item->bindModel(array('hasOne'=>array('ItemsLocation'))); $contain['ItemsLocation']=array(); $conditions[]=array('ItemsLocation.location_id'=>$locationId); $order = array('Item.created' => 'desc'); // set order ... $items = $this->paginate('Item', compact('conditions','contain','order')); 

Мне удалось заставить его работать несколько, но решение совсем не очень кстати.

 $items = $this->paginate( $this->Request->ToLocation->Item, array( "Item.id IN (" . "SELECT item_id FROM items_locations " . "WHERE location_id = " . $locationId . ")" ) );