検索結果の件数が多い時などに、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 件のコメント:
コメントを投稿