BLOGスタッフブログ

インソースマーケティングデザイン

2012.10.05 システム

[CakePHP]複数テーブルでPagenationする

何か検索した結果一覧でPagenationしたいのはよくある話。
CakePHPでPagenationを実現するのはPagenatorヘルパーを利用すれば簡単!
しかし、利用するテーブルが複数テーブルになったとたんに、
小難しくなってくる。bindModel?Join?
結果一覧でソートもしたいなんてなったら困ってしまう。

そこで、弊社ではCakePHPを以下のようにカスタマイズして
複数テーブルでのPagenationを実現している。
CakePHPのCookbookに書いてある内容を参考に。
参考:カスタムしたクエリによるページ付け

◆弊社利用CakePHPVer. 2.1.1
1.カスタマイズPagenator用モデルを準備

/**
   * ページネート実行
   * @param conditions(Array:検索条件)
   * @param fields(Array:検索フィールド)
   * @param order(Array:ORDER BY句)
   * @param limit(Array:検索最大件数)
   * @param page(Array:ページ番号)
   * @param recursive(Array:再帰的取得深度)
   * @param extra(Array:検索用SQL)
   * @return Array(結果セット)
   */
  public function paginate($conditions, $fields = null, $order, $limit, $page = 1, $recursive = null, $extra = array()) {
    // 初期設定
    if ($page == 0) {
      $page = 1;
    }
    $offset = $page * $limit – $limit;
    $database =& ConnectionManager::getDataSource($this->useDbConfig);
    $conditions = $database->conditions($conditions);

    // SQL生成
    $sql = $extra[‘originalSql’];
    $sql .= $conditions;
    if (count($order) > 0) {
      $strOrderSql = ”;
      $numCnt = 0;
      foreach ($order as $key => $value) {
        if ($numCnt > 0) {
          $strOrderSql .= ‘,’ . $key . ‘ ‘ . $value;
        } else {
          $strOrderSql .= $key . ‘ ‘ . $value;
        }
        $numCnt++;
      }
      $sql .= ‘ ORDER BY ‘ . $strOrderSql;
    }
    $sql .= ‘ LIMIT ‘ . $limit;
    $sql .= ‘ OFFSET ‘ . $offset;

    // SQL実行
    $aryParams = array();
    if (isset($extra[‘params’])) {
      $aryParams = $extra[‘params’];
    }
    return $this->query($sql, $aryParams, false);
  }

  /**
   * ページネート実行(カウント処理)
   * (paginateCountメソッドのオーバーライド)
   * @param conditions(Array:検索条件)
   * @param recursive(Array:再帰的取得深度)
   * @param extra(Array:検索用SQL)
   * @return Number(検索結果件数)
   */

  public function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
    // 初期設定
    $database =& ConnectionManager::getDataSource($this->useDbConfig);
    $conditions = $database->conditions($conditions);

    // SQL生成
    $sql = $extra[‘originalSql’];
    $sql .= $conditions;

    // SQL実行
    $this->recursive = $recursive;
    $aryParams = array();
    if (isset($extra[‘params’])) {
      $aryParams = $extra[‘params’];
    }
    return count($this->query($sql, $aryParams, false));
  }

}
?>

3.クエリを書くモデルを準備

2.コントローラーから利用

  $this->paginate = array(‘Member’ => array(
    ’conditions’ => array(‘detail.member_address’ => ‘東京都’),
    ’limit’ => 10,
    ’order’ => array(‘member.id’ => ‘asc’),
    ’recursive’ => 1,
    ’originalSql’ => $this->Member->getMemberList(),
    ’params’ => array(),
  )
  );

どうでしょう?SQLが書ければ何でも来いです。
以上です。ではまた。

インソースマーケティングデザインが書いた他の記事

見積もり・ご依頼など、
お気軽にご相談ください

本サイトはユーザーエクスペリエンスの向上などを目的に、Cookieを使用しています。
右記のバナーで「同意する」をクリックする、または本サイトを利用することにより、
お客様は弊社のCookieポリシーに同意したことになります。

同意します