2011-09-20 17 views
0

this questionと似ていますが、私のCakePHPに対する不満のために、私はこれを理解できないようです。ここに私のセットアップです。CakePHP:関連するhasManyフィールドのクエリ制約を使ったページネーション?

Commentsのモデル名Userがあります。少なくとも1つのCommentを持つすべての不可視のリストUsersが必要です。コントローラには、records$this->paginate()と設定するメソッドがあり、値は渡されません。代わりに、$paginate varは条件やそのようなもので設定されます。

class UsersController extends AppController { 
    var $name = 'Users'; 
    var $paginate; 

    function new_users() { 
     $this->User->recursive = 1; 
     $this->paginate['User']['contain'][] = 'Comment'; 
     $this->paginate['User']['order'] = 'User.DateCreated DESC'; 

     $conditions = array(); 
     // Get invisible users... 
     $conditions[] = array('User.Status = ?' => 'Invisible'); 
     $conditions[] = array('User.Enabled' => true); 
     // ...with at least one active comment 
     $conditions[] = array('Comment.Status' => 'Active'); 

     // Load these conditions and fire pagination to render the view 
     $this->paginate['User']['conditions'] = $conditions; 
     $this->set('records', $this->paginate()); 
    } 
} 

私はCakePHPには新しく、このようなものはまだ私の頭の上にあります。私はちょうどアクティブCommentsを持っているUsersのリストがほしいです。今すぐ、このクエリはネットユーザー0人です。 Comment.Statusに関する行を削除すると、クエリは終了しますが、コメントがあるかどうかにかかわらず、すべて表示されません。Users

私がpaginate()の電話を見たことのある場所では、何かが渡されました(paginate('User', array('Comment.Status' => 'Active'))など)。

を編集してください:私は次のコードを持っていますが、クリーナーでも同じ結果が得られます。

$this->paginate = array(
    'conditions' => array(
    'User.Status' => 'Invisible', 
    'User.Enabled' => true, 
), 
    'contain' => array(
    'Comment' => array(
     'conditions' => array(
     'Comment.Status' => 'Active', 
    ) 
    ) 
), 
    'recursive' => 1, 
    'order' => 'User.DateCreated DESC', 
); 
$data = $this->paginate('User'); 

答えて

1

私は通常、オンザフライでページ変更を使用します。ここにいくつかのコード例があります。

Hereページ設定のコントローラ設定の詳細については、こちらをご覧ください。しかし、すでにモデル(hasManyなど)に関連がある場合、データを含む必要がなく再帰的に1を入れるとデータが自動的にフェッチされます(必要なデータのみを取得するために使用することができます)。あなたを探す方法の例:

$this->paginate = array(
    'conditions' => array(
     'User.Status' => 'Invisible', 
     'User.Enabled' => true 
    ), 
    'contain' => array('Comment' => array(
      'conditions' => array('Comment.Status' => 'Active') 
    )), 
    'recursive' => 1, 
    'order' => 'User.DateCreated DESC' 
); 
$data = $this->paginate('User'); 

これはあなたの投稿に入れたものです。あなたが望むもののSQLクエリを貼り付けると、私はあなたをもっと助けることができるかもしれません。また、sql出力を調べて、条件に何か問題があるかどうかを確認してください。もしあなたが持っていないし、SQLの出力を置く方法を知らないだけでこれを行う。

var_dump($this->User->getQuery(
    'conditions' => array(
     'User.Status' => 'Invisible', 
     'User.Enabled' => true, 
     'Comment.Status' => 'Active' 
    ), 
    'contain' => 'Comment', 
    'order' => 'User.DateCreated DESC' 
)); 

は、それがない場合は、私のコメントを残して、あなたのお役に立てば幸いです。

EDIT:これはあなたが望むものを得るために必要なものです。 :D必要に応じてテーブルと条件を変更します。

$this->paginate = array(
    'conditions' => array(
     'User.Status' => 'Invisible', 
     'User.Enabled' => true 
    ), 
    'joins' => array(
     array(
      'table' => 'name_of_comment_table', 
      'alias' => 'Comment', 
      'type' => 'inner', 
      'conditions' => array(
       'Comment.user_id = User.id', 
       'Comment.Status' => 'Active' 
      ) 
     ) 
    ), 
    'contains' => array('Comment'), 
    'group' => 'User.id', 
    'recursive' => 1, 
    'order' => 'User.DateCreated DESC' 
); 
$data = $this->paginate('User'); 
+0

あなたの助けを借りて、私は近づいています。私の見解では私のデータにアクセスできないようです。私は '$ this-> set( 'records'、$ data)'を使っています - 私のページネーション数は正確です(私の見解では1300+レコードが集まっています)。 '$ records'(私の見解ではそこには何もないようです)。 –

+0

@BenjaminKreegerビューに送信する前にvar_dumo($ data)を試してください。データをフェッチしているかどうかはわかります(ページナンバーのコードを使用し、最後のgetQueryではなく、 – api55

+0

'var_dump($ this-> paginate( 'User'))'は 'bool(false)'を表示します。あなたが答えに示したように '$ this-> paginate ='を設定しました。私はこの事を窓の外に投げる準備ができている。 –

関連する問題