amazonバナー

2012年2月22日水曜日

CodeIgniterのPaginationクラスのハマリどころ

CodeIgniterのPaginationクラスは検索画面などで
検索結果の件数が多い時などに、1ページ、2ページ…と
分けて表示する際に重宝するライブラリですが、
使い方にちょっとクセがあり、それはCodeIgniter自身の特性にも関係しているので
Paginationクラスが悪いわけではありませんがここで解説します。

長くなるので続きはwebで。


検索画面を想定すると、Paginationを使う場合に
検索結果の総件数を取得するクエリと n ページで表示する分のクエリの
2回発行する必要があります。
ActiveRecordを利用している場合には、一度総件数を取得する際に
$this->db->get()->num_rows();
した後に、1ページ分の情報を取得しようとLimit句を追加して以下のように再度クエリを実行したいと思います。
$this->db->limit(10, 0);
$this->db->get();
ところが、ActiveRecordの特性上、一度クエリを発行してしまうと
Where句の条件などはクリアされてしまいます。
同じ条件文を作成する為にコードをコピーするのはさすがにナンセンスだと思います。
ActiveRecordではこのようなことを想定してか、キャッシングという機能があります。
$this->db->start_cache(); // クエリキャッシュ開始

$this->db->from('table');
$this->db->where('a', 'b');
$this->db->order_by('c', 'asc');

$this->db->stop_cache(); // クエリキャッシュ終了

// 総件数取得
$total_rows = $this->db->get()->num_rows();

$per_page = 10;
$config['base_url'] = '/test/';
$config['total_rows'] = $total_rows;
$config['per_page'] = $per_page;
$config['first_link'] = "最初";
$config['last_link'] = "最後";

// ページネーション作成
$this->pagination->initialize($config);

// 1ページの表示限界設定
$this->db->limit(10, $offset);
$query = $this->db->get();

// クエリキャッシュクリア
$this->db->flush_cache();
このようにすると総件数で取得した条件文を保持したまま、Limit句を追加して
再度クエリを発行することができます。

0 件のコメント:

コメントを投稿