2009-09-23 7 views
3

Je rencontre des problèmes avec la création de pagination avec une relation HABTM. Tout d'abord, les tables et les relations:Pagination CakePHP avec les modèles HABTM

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

Ainsi, une demande a un emplacement de la demande provient de et un emplacement de la demande va -. Pour cette question, je suis seulement préoccupé par le "à" l'emplacement.

Request --belongsTo--> Location* --hasAndBelongsToMany--> Item 

(* as "ToLocation") 

Dans mon RequestController, je veux paginer tous les éléments dans la ToLocation d'une demande.

// RequestsController 
var $paginate = array(
    'Item' => array(
     'limit' => 5, 
     'contain' => array(
      "Location" 
     ) 
    ) 
); 

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

Et ce ne parvient pas, car il génère ce SQL:

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

Je ne peux pas comprendre comment faire réellement utiliser l'argument « contenir » des $paginate ...

Des idées?

Répondre

1

J'ai été capable de le faire fonctionner un peu, mais la solution ne semble pas très gélatineuse du tout.

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

Ceci est la seule façon qui a fonctionné pour moi, ayant des noms de champ non conventionnel table HABTM. –

3

Pour paginer HABTM, vous devez lier 'hasOne' temporairement rejoindre un modèle à qui vous paginez:

// 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

Cela ne fonctionne pas réellement. Le second paramètre de 'paginate()' * only * prend des conditions. Les choses supplémentaires doivent être ajoutées au tableau '$ this-> paginate'. – nickf

+1

oh man .. vous ne pouvez pas lire la documentation sur la pagination? ici corriger edit de mes projets pour votre cas: $ this-> paginate ['Item'] = compact ('contenir', 'conditions', 'commander'); $ items = $ this-> paginate ('Item'); – Sergei

11

après 3 jours de recherche, j'ai trouvé le chemin

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

Il est recommandé d'ajouter un groupe, car nous recevrons parfois des messages en double dans différentes catégories

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

Ajouter faux à utiliser le modèle de liaison à toutes les requêtes, non seulement les suivantes

+0

Y at-il un truc pour limiter les résultats de pagination? Je n'arrive pas à le faire fonctionner –

Questions connexes