このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0068

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->start_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();
    SELECT * FROM `any_table` WHERE `member_id` = 'A001' OR `member_id` = 'B005';
    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()」メソッドの間で実行され、再利用指示を取り消します。
キャッシュをクリアすろことはありません。
 (本家マニュアルの説明は間違っているようです。)

    $this->db->start_cache();
    $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');
    }
    • $reuse === FALSE
    SELECT * FROM `any_table` WHERE `status` = 1;
    • $reuse === TRUE
    SELECT * FROM `any_table` WHERE `member_id` = 'A001' AND `status` = 1;

「OR `member_id` = 'B005'」は、最初の「get()」メソッド実行後にクリアされます。
最初の「get()」メソッド後の「`status` = 1」は「flush_cache()」メソッドでクリアされません。
「flush_cache()」メソッドがクリアするのは「`member_id` = 'A001'」だけです。