インソースマーケティングデザイン
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.コントローラーから利用
’conditions’ => array(‘detail.member_address’ => ‘東京都’),
’limit’ => 10,
’order’ => array(‘member.id’ => ‘asc’),
’recursive’ => 1,
’originalSql’ => $this->Member->getMemberList(),
’params’ => array(),
)
);
どうでしょう?SQLが書ければ何でも来いです。
以上です。ではまた。