2009-12-26 46 views
5

Tôi đang sử dụng CakePHP và muốn hiển thị tất cả các bài gửi thuộc Danh mục 'X' Tôi có 4 bảng có mối quan hệ HABTM.CakePHP truy xuất HABTM có điều kiện

Users -> (haveMany) -> Submissions < -> (hasAndBelongsToMany) < -> Categories

nhưng tôi muốn làm như vậy bằng cách sử dụng $ this-> paginate() và đối với mỗi trình Tôi muốn để hiển thị người dùng đã đăng nội dung gửi.

tài Bảng

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

Nộp Bảng

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

Thể loại Bảng

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

SubmissionCategory Bảng

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

Tôi gặp thực sự rắc rối tạo ra một paginate mà có thể làm được điều này, tôi bắt đầu nghĩ rằng mình không thể, trừ khi tôi đang thiếu một cái gì đó.

Nếu tôi đã không sử dụng cakephp này là truy vấn tôi muốn làm

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 

Trả lời

7

mối quan hệ HABTM đang rất khó sử dụng trong CakePHP tôi tìm thấy. Bạn sẽ cần thiết lập các phép nối thủ công bằng biến $ paginate. Sau đó, bạn có thể chuyển mảng mảng điều kiện tùy chọn đến hàm paginate(). Ví dụ:

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

?> 
Các vấn đề liên quan