[cakephp] group by を使っていると paginateが返す値がおかしい。

[cakephp] group by を使っていると paginateが返す値がおかしい。ASのおもちゃ箱開発ブログgroup byを使用して、paginateを使うと、帰ってくる値がおかしい。
結局、以下のように自分で計算・取得しなおして、対処した。

        $params =
            array(
                "conditions" => array('Test.keyword' => $keyword),   // 検索条件
                'fields' => array('Test.id'),
                'group'=>'Test.id',
                'order'=>'Test.created'
            );

        $this->Test->recursive = 0;

        $this->paginate = array_merge($params, array("limit" => $limit));
        $results = $this->paginate();

        // paginateが返す件数とページ数などがおかしいので修正する
        $sql = 'SELECT id
                FROM tests Test'
;
        $sql .= " WHERE keyword='".$keyword."' ";
        $sql .= " GROUP BY id ";
        $results_count = $this->Test->query($sql, false);

        $this->params['paging']['Test']["current"] = isset($this->params["named"]["page"]) ? $this->params["named"]["page"] : 1;
        $this->params['paging']['Test']["page"] = isset($this->params["named"]["page"]) ? $this->params["named"]["page"] : 1;
        $this->params['paging']['Test']["count"] = count($results_count);
        $this->params['paging']['Test']["pageCount"] = intval(ceil(count($results_count) / $limit));
        $this->params['paging']['Test']["prevPage"] = ($this->params['paging']['Test']["page"] > 1);
        $this->params['paging']['Test']["nextPage"] = ($this->params['paging']['Test']["count"] > ($this->params['paging']['Test']["page"] * $limit));

        // paginateが返すレコードがおかしいので修正する
        $limit_from = ($this->params['paging']['Test']["current"]-1) * $limit;

        $sql = 'SELECT id
                FROM tests Test'
;
        $sql .= " WHERE keyword='".$keyword."' ";
        $sql .= " GROUP BY id ";
        $sql .= " LIMIT  ".$limit_from.",".$limit;
        $results = $this->Test->query($sql, false);

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>