2010-03-14 7 views
1

j'ai plusieurs HABTM comme ceux-ci:CakePHP paginera multiples HABTM

// modèle utilisateur
var $ hasMany = array ('Post');

// Post-modèle
var $ hasAndBelongsToMany = tableau ('Category', 'Tag');

// Modèle de catégorie
var $ hasAndBelongsToMany = array ('Post');

// Modèle de balise
var $ hasAndBelongsToMany = array ('Post');

J'ai essayé d'aller chercher tout le courrier avec son utilisateur et ses balises (dans une certaine catégorie), d'une façon ou d'une autre si je récupère des balises, le résultat est faux.

$this->paginate = array 
(
    'Post' => array 
    (
     'limit' => 2, 

     'fields' => array(
      'Post.title', 'Post.content', 'Post.slug', 'Post.created', 
      'Tag.name', 
      'User.username', 'User.created', 'User.post_count', 'User.avatar_file_name'), 

     'joins' => array 
     (
      array(
       'table' => 'categories_posts', 
       'alias' => 'CategoriesPost', 
       'type' => 'inner', 
       'conditions'=> array('CategoriesPost.post_id = Post.id') 
      ), 

      // FETCH USER 
      array(
       'table' => 'users', 
       'alias' => 'User', 
       'type' => 'inner', 
       'conditions'=> array('Post.user_id = User.id') 
      ), 

      // FETCH TAGS 
      array(
       'table' => 'posts_tags', 
       'alias' => 'PostsTag', 
       'type' => 'inner', 
       'conditions'=> array('PostsTag.post_id = Post.id') 
      ), 

      array(
       'table' => 'tags', 
       'alias' => 'Tag', 
       'type' => 'inner', 
       'conditions'=> array('Tag.id = PostsTag.tag_id') 
      ), 

      array(
       'table' => 'categories', 
       'alias' => 'Category', 
       'type' => 'inner', 
       'conditions'=> array('Category.id = CategoriesPost.category_id', 'Category.slug' => $slug) 
      ) 
     ) 
    ) 
); 

$posts = $this->paginate(); 

Quelqu'un peut-il donner une solution puisque je suis un débutant? un grand merci ...

+0

Que voulez-vous dire par «mauvais»? Pouvez-vous enregistrer le jeu de résultats? – sibidiba

+0

Eh bien, si je récupère Tag, le résultat est une boucle du premier message. Mais si aucune balise n'a été récupérée, elle renvoie tous les messages dans un résultat correct. – izmanromli

Répondre

1

J'ai rencontré un problème similaire, en essayant de paginer un jeu de résultats en utilisant un modèle associé. J'ai fini par devoir lier manuellement mes modèles, lancer la requête, puis les dissocier afin que Cake contienne les bonnes données ensemble. (http://book.cakephp.org/view/86/Creating-and-Destroying-Associations-on-the-Fly)

Vous pouvez également essayer le comportement de confinement qui vous permettra de spécifier les modèles que vous souhaitez inclure dans votre jeu de résultats. Containable est le noyau dans 1.2+ (http://book.cakephp.org/view/474/Containable), sinon vous devrez l'attraper vous-même.

Je ne sais pas trop pourquoi vous avez une telle requête gargantuesque. Je serais plus enclin à faire quelque chose de semblable à ce qui suit.

$this->Model->recursive = 2; 
$this->Model->paginate(); 

Et laissez Cake obtenir toutes les données relatives pour moi à travers mes associations. Ensuite, je voudrais ajuster le retour en utilisant un tableau de conditions (http://api.cakephp.org/class/controller#method-Controllerpaginate) pour spécifier la catégorie.

Désolé, ce n'est pas une solution de fait, mais je suis moi-même un amateur de CakePHP! Vous pourriez trouver plus facile d'afficher les requêtes, les résultats, etc, en utilisant DebugKit, http://github.com/cakephp/debug_kit

+0

Salut David, J'utilise Containable pour récupérer la balise et joint la table pour la catégorie. Pas la meilleure solution pour moi mais au moins je reçois ce que je veux – izmanromli

Questions connexes