CakePHP2 fetchAll がクエリ結果をデフォルトでキャッシュする

テストコードを書いている時に、Fixtureで用意したテーブルの値を変更するコードを追加した後にテストを実行していた部分で、帰ってくるべき結果が帰ってこないので、1時間以上はまった。 ふと、どこかがキャッシュしてるんじゃないか?と、ググったら下のページを見付けた。

CakePHP2 独自SQL文でPrepared Statementを使う – cakephperの日記(CakePHP, Laravel, PHP)

デフォルトだとキャッシュが効いてしまうので、第3引数にarray(‘cache’ => false)を渡せばキャッシュ無効にできます

http://api.cakephp.org/class/dbo-source#method-DboSourcefetchAll

// in controller
$result = $this->Post->getDatasource()->fetchAll(
    'select * from posts as Post where Post.id = ? or Post.id = ?', 
    array(1, "abc"),
    array('cache' => false)
);

ここで言っているキャッシュとは、1回のアクセスの中でのみ利用されるため、1アクセスで同じクエリが複数回実行されるものに限り有効になります。

指定もしないのにデフォルトでクエリ結果をキャッシュする仕様に違和感を覚えた。 キャッシュするかしないかはプログラマに決めさせればいいと思うから、デフォルトではキャッシュしないようにするのが自然に感じる。

CakePHP2になって、1系の時よりは落とし穴が少ないと感じていたけど、CakePHP2を使って開発を続けてるとぽつぽつと出てくるなぁ。

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.