5

Cakephp を使用しており、カテゴリ 'X' の一部であるすべての提出物を表示したいと考えています。HABTM 関係を持つ 4 つのテーブルがあります。

ユーザー -> (haveMany) -> 提出物 <-> (hasAndBelongsToMany) <-> カテゴリ

しかし、私は $this->paginate() を使用してそうしたいと思います。投稿ごとに、投稿を投稿したユーザーを表示したいと思います。

ユーザーテーブル

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

提出表

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

カテゴリー表

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

SubmissionCategory テーブル

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

これを行うことができるページネーションを作成するのに本当に苦労しています。何かが欠けていない限り、それは不可能だと思い始めています。

私がcakephpを使用していなかった場合、これは私がやりたいクエリです

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
4

1 に答える 1

7

私が見つけたCakePHPでは、HABTMの関係は非常に扱いにくいものです。$paginate変数を使用して手動で結合を設定する必要があります。次に、オプションの条件配列をpaginate()関数に渡すことができます。例:

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

?>
于 2009-12-27T23:59:32.103 に答える