CakaPHP2 検索結果をPaginatorに渡す時に注意すること

頻繁にあり得るシチュエーション。
検索結果をPaginatorに渡して一覧表示させたい、という場合。

今回はfind等は使わず、独自SQLをPaginatorに渡して
一覧表示させてみました。

satthi殿の公開されているModelを引用させていただきました。

CakePHPで素書きのSQLでもPaginatorを使いたい! – Qiita
http://qiita.com/satthi/items/216f951d48187499abe7

技術系サイトの中でも特にQiitaは、最近上位表示されている気がしますね。

$query['extra']['type'] = $sql;
$this->Paginator->settings = $query;
$customers = $this->Paginator->paginate('RawSql');

これでカンペキ!と思っていたら落とし穴がありました。
POSTされた検索条件を$this->request->dataから取得していたのですが、
次ページに遷移した時などにおかしな動きになってしまうのです。

調べてみると$this->request->dataが初期化されてしまうことが原因。

ということでSession変数に一旦退避させ、
そこから検索条件を取得することで対応しました。

define('VAR_SESSION', 'SEARCH_CONDITION');

if (empty($this->request->data['search']) == false) {
$this->Session->write(VAR_SESSION, $this->request->data['search']);
}
$params = null;
if($this->Session->check(VAR_SESSION)) {
$params = $this->Session->read(VAR_SESSION);
}
$sql = $this->(Model名)->(SQL生成するメソッド名)($params);

seto-san殿のブログを参考にさせていただきました。

1.2・検索結果をpaginateする方法 – せとっちの備忘録(技術系)
http://d.hatena.ne.jp/seto-san/20090813/1250171541

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です