2009-09-23 3 views
3

У меня возникли проблемы с созданием разбиения на страницы с отношением HABTM. Во-первых, таблицы и отношения:Pagination CakePHP с моделями 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 ...

Любые идеи?

ответ

1

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

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

Это единственный способ, который работал для меня, имеющие имена не конвенционные поля в HABTM таблице. –

3

Для постраничной 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')); 
+0

На самом деле это не работает. Второй параметр 'paginate()' * only * принимает условия. Дополнительные вещи нужно добавить в массив '$ this-> paginate'. – nickf

+1

oh man .. вы не можете читать документацию по разбивке на страницы? здесь правильное редактирование из моих проектов для вашего дела: $ this-> paginate ['Item'] = compact ('содержать', 'conditions', 'order'); $ items = $ this-> paginate ('Item'); – Sergei

11

после поиска 3 дня, я нашел способ

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))); 

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

+0

Есть ли уловка, чтобы ограничить результаты разбивки на страницы? Кажется, я не могу работать –

Смежные вопросы