У меня возникли проблемы с созданием разбивки на страницы с помощью отношения 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 . ")" ) );