CakePHP Paginationでgroup byを利用するとページナンバーが「1」になる

notoです。

paginationでgroup byを利用したところ、ページャーの表示がおかしかったのでその対策です。

環境

  • CakePHP1.3.12

paginateプロパティに渡す値は、こんな感じ。

1
2
3
4
5
6
7
$this->paginate = array(
    'fields' => array(
        -- 省略 --
     ),
    'group' => array('HogeModel.name'),
    'limit' => '10'
);

このままだと、SQLの結果が何件あろうが$paginator->numbersの値が「1」で返ってきてしまいます。

そこで、app/app_model.phpに、paginateCount()をオーバーライドします。paginateCountが存在しない場合、$object->find(“count”)で内部的には処理されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* ページネーションGroupBY対応
*/
public 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;
}

getAffectedRows()というのはSQLで影響を受けた行数を返却するので、これでGroupByしてもページャーが正しく表示されます。

備考

もうすぐこのブログメンバーに新しい人が参加します。このむさ苦しい中、紅一点。 皆様よろしくお願いいたします。

参考

Group Byしている時にpaginator->number()が表示されない件

Comments