読者です 読者をやめる 読者になる 読者になる

cakephp1.2 paginateのgroup by対策

paginateの条件に対してgroup byを使うとページ数が正しく表示されなくなる。

具体的には、1ページ100件としてページングを設定していた場合、検索結果が1000件だったとしても、最初の1ページしか表示されない、といった症状が起きる。

これのやっかいだと感じたところは、例えばテスト環境でテストするときって少ない件数でテストするから、1ページ100件でなくて2件とかにしてページングちゃんと機能するよね?って確認はするんだけど、今回のものは1ページ2件とかにすると数ページ表示されて正しく動いているように見えたもんだから騙されてしまった。。

本番と同じデータでテストするのが本来は1番ベストなんだよね。
それが出来なければ一定量のテストデータを面倒臭がらずに作成する。
少ない件数だとどうしても想定外のバグが入り込んでしまう。

改めて勉強になった。

ちなみにこのバグの対策は対象のモデルに以下の関数を追加してやるだけでOK

<?php
// paginateのgroup by対策
function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
    $parameters = compact('conditions');
    $this->recursive = $recursive;
    $count = $this->find('count', array_merge($parameters, $extra));
    if (isset($extra['group'])) {
        $count = $this->getAffectedRows();
    }
    return $count;
}

参考サイト
http://d.hatena.ne.jp/aroundthedistance/20090728/1248784179