AR プロパティキャッシュ
CodeIgniterのActiveRecordでは、「select()」メソッドや「where()」メソッドでSQLクエリ文を
部分的にキャッシュして、「get()」メソッドや「insert()」、「update()」メソッドといったSQLクエリの
実行を行うメソッドがコールされてからキャッシュされたSQLクエリの文字列を構築してSQLクエリを
データベースに発行します。
キャッシュされたSQLクエリは、「get()」、「insert()」、「update()」などのSQLクエリを発行する
メソッドが実行されると、全てクリアされます。
しかしながら、一つのプロセスで複数のSQLクエリを発行するような処理では、 「WHERE」条件句などの再利用ができると便利でしょう。
CodeIgniterのActiveRecordでは、SQLクエリ発行後もキャッシュをクリアせず、再利用する方法が用意されています。
SQLクエリの再利用
以下の2つのメソッド「start_cache()」と「stop_cache()」の間でキャッシュされたSQLクエリは、
「get()」メソッドなどのSQLクエリ発行するメソッドがコールされた後も クリアされることなく再利用可能
となります。
start_cache()
stop_cache()
再利用したいSQLクエリをキャッシュするメソッド実行前に「start_cache()」メソッドを実行します。
再利用するSQLクエリがすべてキャッシュされたら「stop_cache()」メソッドを実行します。
$this->db->where('member_id', 'A001'); // 再利用する
$this->db->from('any_table'); // 再利用する
$this->db->stop_cache();
$this->db->or_where('member_id', 'B005'); // 再利用しない
$query = $this->db->get();
$this->db->set('status', 0);
$query = $this->db->update();
UPDATE `any_table` SET `status` = 0 WHERE `member_id` = 'A001';
再利用されているのは「`member_id` = 'A001'」とテーブル名の「'any_table'」です。
「OR `member_id` = 'B005'」は「get()」メソッド実行後にクリアされています。
flush_cache()
「start_cache()」メソッドと「stop_cache()」メソッドの間で実行され、再利用指示を取り消します。
キャッシュをクリアすろことはありません。
(本家マニュアルの説明は間違っているようです。)
- $reuse === FALSE
- $reuse === TRUE
$this->db->where('member_id', 'A001'); // 再利用する
$this->db->stop_cache();
$this->db->or_where('member_id', 'B005'); // 再利用しない
$query = $this->db->get('any_table');
$this->db->where('status', 1);
if ($reuse === FALSE) {
// やっぱり再利用やめる
$this->db->flush_cache();
$query = $this->db->get('any_table');
} else {
// 再利用する
$query = $this->db->get('any_table');
}
「OR `member_id` = 'B005'」は、最初の「get()」メソッド実行後にクリアされます。
最初の「get()」メソッド後の「`status` = 1」は「flush_cache()」メソッドでクリアされません。
「flush_cache()」メソッドがクリアするのは「`member_id` = 'A001'」だけです。