2009-12-26 5 views
5

Sto usando cakephp e vorrei visualizzare tutte le Inserzioni che fanno parte della Categoria 'X' Ho 4 tabelle con una relazione HABTM.Cakephp che recupera HABTM quali Condizioni

Utenti -> (havemany) -> Presentato < -> (hasAndBelongsToMany) < -> Categorie

ma vorrei farlo utilizzando il $ this-> paginate() e per ogni presentazione che vorrei per visualizzare l'utente che ha pubblicato l'invio.

tabella utente

Id |  Name   
-----+------------------- 
1 | User 1  
2 | User 2  

Presentazione Tabella

Id |  Name   | User_id 
-----+-------------------+-------------- 
1 | Submission 1 |  1  
2 | Submission 2 |  2  

Tabella categoria

Id |  Name 
-----+------------------- 
1 | Category 1   
2 | Category 2   

SubmissionCategory Tabella

Id | Submission_id | Category_id 
-----+-------------------+------------------- 
1 |   1   |  1  
2 |   1   |  2 
3 |   2   |  1  

Sto avendo davvero problemi a creare un paginate che può fare questo, sto iniziando a pensare che la sua non è possibile a meno che mi manca qualcosa.

Se non stava usando cakephp questa è la domanda che vorrei fare

SELECT 
    * 
FROM 
    submissions_categories, 
    submissions, 
    users 
WHERE 
    submissions_categories.category_id = 8 
      AND 
    submissions_categories.submission_id = submissions.id 
      AND 
    submissions.user_id = users.id 

risposta

7

rapporti HABTM sono molto ingombranti in CakePHP trovo. Avrai bisogno di impostare manualmente i join usando la variabile $ paginate. Quindi è possibile passare l'array delle condizioni facoltative alla funzione paginate(). Esempio:

<?php 
class SubmissionsController extends AppController { 

var $name = 'Submissions'; 
var $helpers = array('Html', 'Form'); 
var $paginate = array('joins' => array(
    array( 
       'table' => 'submissions_categories', 
       'alias' => 'SubmissionsCategory', 
       'type' => 'inner', 
       'conditions'=> array('SubmissionsCategory.submission_id = Submission.id') 
      ), 
      array( 
       'table' => 'categories', 
       'alias' => 'Category', 
       'type' => 'inner', 
       'conditions'=> array( 
        'Category.id = SubmissionsCategory.category_id' 
       ) 
      ))); 

function index() { 
    $this->Submission->recursion = 1; 
    $this->set('submissions', $this->paginate(array('Category.id'=>1))); 
} 
} 

?>