CakePHP2 fetchAll がクエリ結果をデフォルトでキャッシュする
2014/10/29
テストコードを書いている時に、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を使って開発を続けてるとぽつぽつと出てくるなぁ。