[CodeIgniter] クエリビルダ(Active Record)のキャッシングを使って開発効率をアップする

CodeIgniterで、クエリビルダ(Active Record)を使う時に、同じような条件設定を使いまわしたいという場面があります。そういう時はクエリビルダキャッシングの出番です。

クエリビルダ キャッシングってなに?

CodeIgniterのクエリビルダ(Active Record)は、一度レコードを取得するとすべての設定がリセットされてしまいます。

例えば、ページング処理した一覧と合計件数の2種類のデータが欲しい時などに、「LIMIT句のある・なし」だけの違いしかない2つのコードを書かなくてはならないので、コードが長く、メンテナンス性も低くなってしまいます。

そこで使えるのがCodeIgniterのクエリビルダに備わっているキャッシング機能です。

クエリビルダ キャッシング

“本当の” キャッシングではないのですが、クエリビルダ では、後で再利用 するためにクエリの特定の部分を保存(あるいは、”キャッシュ”)することができます。 通常は、クエリビルダ の呼び出しが完了したときには、保存された全情報は、 次の呼び出しのためにリセットされます。キャッシングを利用すると、 このリセットを回避することができ、情報を簡単に再利用できます。

キャッシュされた呼び出しは、累積されます。2回のキャッシュされた select() を呼び出し、その後に 2回キャッシュされていないselect() を呼び出した場合、 4回 select() を呼び出したことになります。3つのキャッシュ関連メソッドが利用できます:
クエリビルダクラス | CodeIgniter公式ドキュメント

ちょっと難解な文章になっていますが、要するに「SELECT、WHEREなどのクエリビルダで設定した値を、キャッシュしておけるよ」という機能です。設定をキャッシュしているだけで、クエリ結果はキャッシュしてません。

クエリビルダ キャッシングを使ってみる

キャッシュする

キャッシュする際は、「start_cache()」「stop_cache()」で対象部分をくくってしまえばOKです。

例えば、

$this->DB1 = $this->load->database('default', TRUE, TRUE);
$this->DB1->start_cache(); //ここから
$this->DB1->select('title');
$this->DB1->from('articles');
$this->DB1->where('tag', 'CodeIgniter');
$this->DB1->stop_cache(); //ここまでをキャッシュ
$this->DB1->get();

//==>> SELECT `title` FROM (`articles`) WHERE `tag` = 'CodeIgniter';

$this->DB1->count_all_result();

//==>> SELECT count(*) FROM (`articles`) WHERE `tag` = 'CodeIgniter';

通常なら一つ目のクエリを実行した段階でリセットされるので、単純に同じ内容のクエリビルダ設定を書かないといけないのですが、キャッシング機能を使うことで、設定系を使いまわすことができます。

キャッシュをクリアする

キャッシュをクリアする際には「flush_cache()」とするだけです。簡単ですね。

$this->DB1->flush_cache();

$this->DB1->count_all_result('articles');

//==>> SELECT count(*) FROM (`articles`) ;

使いどころをつかめば、かなりコードを短くできそうなCodeIgniterのクエリビルダキャッシング。

開発効率の向上にも直結する機能ですので、ぜひ使ってみてください。