12780


phpの初心者です。

events,events_tags,tagsというテーブルを用意して特定のタグを持っているイベント一覧を取得しています。

以下cakephpのコントローラーの記述になります。

[code]

        //$tag_idを持つeventを参照
        $options = array('conditions' => array('Events_tag.tag_id' => $tag_id));
        $events_tag = $this->Events_tag->find('all', $options);
    
    
        //$eventsの詳細を全て取得
        $events = array();
        for ($i=0; $i<count($events_tag); $i++) {
            $options = array('conditions' => array('Event.id' => $events_tag[$i]['Events_tag']['event_id']));
            $events[$i] = $this->Event->find('first', $options);
        }
        //ページネーション＆ソーティング
        $this->paginate = array('limit' => 20, 'order' => 'Event.ja_openhour asc', 'paramType' => 'querystring');
        $events = $this->paginate('Event');
        $this->set('events', $events);
    
[/code]

最後から2行目の

$events = $this->paginate('Event');

の記述の前後で$eventsをデバッグすると：  
前-> $tag_idを持つ$events一覧、  
後-> 全ての$events一覧

となってしまうのですが、$events =
$this->paginate('Event')で上書きをしてしまっているのでしょうか？もしそうだとしたらそうならずにページネーションを実装させたいのですが、どなたかご教授御願い致します。


CC BY-SA 3.0
2015-07-28T08:49:44.550
12770
2015-07-31T06:31:06.037
2015-07-31T06:31:06.037
8000
8500
question
php cakephp
CakePHPのページネーション処理で検索条件が想定どおりに反映されない


`$this->paginate()`
メソッドの挙動について誤解があるようです。このメソッドは取得済みの結果を絞り込むのではなく、このメソッドを呼び出したときにSQLを実行してその都度新たにテーブルからデータを取得します。  
提示されているソースだと、ページネーションの部分でレコードを絞り込む条件が何も指定されていないため、直前の`$events`の内容に関係なく、単に`Event.ja_openhour`の昇順で上位から最大20件を取得する形になっています。

希望の動作をさせるためには、`$this->paginate` にイベントIDの配列を渡す必要があります。  
またCakePHPは2.2以降ならHashクラスという便利なライブラリがあるので積極的に利用すると良いでしょう。このユーティリティクラスは特に階層の深い配列を扱うときに有用です。

以下のような感じでどうでしょうか。  
なお`$page`が勝手に増えていますが、表示したいページ番号が格納されているという想定です。

[code]

    // 取得済みの$events_tagからイベントIDの集合を配列として抽出
    $event_ids = Hash::extract($events_tag, '{n}.Events_tag.event_id');
    // ページネーション
    $this->paginate = array(
        'limit' => 20,
        'page' => $page,
        'order' => 'Event.ja_openhour asc',
        'paramType' => 'queryString',
        'conditions' => array('Event.id' => $event_ids),
    );
    $events = $this->paginate('Event');
    
[/code]

参考

  * [ページ制御 — CakePHP Cookbook 2.x ドキュメント](http://book.cakephp.org/2.0/ja/core-libraries/components/pagination.html)
  * [Hash — CakePHP Cookbook 2.x ドキュメント](http://book.cakephp.org/2.0/ja/core-utility-libraries/hash.html)


CC BY-SA 3.0
2015-07-28T23:17:54.157
12780
2015-07-28T23:17:54.157
10492
12770
answer