0

私は Yii 1.1.16 を使用しておりCSqlDataProvider()、データを に表示していますCGridView。最後のページに移動すると、最後のページPageSizeのレコード数ではなく、最後のカウント レコードが取得されます。たとえば、12 レコードのグリッドがありPageSize、10 に設定すると、2 ページあることを意味します。したがって、1 ページ目では 1 ~ 10 のレコードを取得しますが、2 ページ (最後のページ) では 3 ~ 12 のレコードを取得します!

これは、各ページで取得する値です

//on page 1
$dataProvider->getPagination()->getPageCount(); //2
$dataProvider->getPagination()->currentPage; //0
$dataProvider->getPagination()->offset; //0

//on page 2
$dataProvider->getPagination()->getPageCount(); //2
$dataProvider->getPagination()->currentPage; //1
$dataProvider->getPagination()->offset; //10

ご覧のとおり、これはページで取得する必要がある値であり、表示されるデータは正しいはずですが、そうではありません。

これは Yii を 1.1.8 からアップグレードする前に動作していたので、意図的に Yii バージョンを書きました。

もう1つ、MSSQLデータを提供するために(Microsoft SQL)データベースを使用しています

4

1 に答える 1

1

これはYiiフレームワークの問題のようで、これがMSSQL解決策の1つであり、オーバーライドしていますCSqlDataProvider

class MSSqlDataProvider extends CSqlDataProvider
{

    /**
     * Fetches the data from the persistent data storage.
     * @return array list of data items
     */
    protected function fetchData()
    {
        $sql = $this->sql;
        $db = $this->db === null ? Yii::app()->db : $this->db;
        $db->active = true;

        if (($sort = $this->getSort()) !== false) {
            $order = $sort->getOrderBy();
            if (!empty($order)) {
                if (preg_match('/\s+order\s+by\s+[\w\s,]+$/i', $sql))
                    $sql.=', ' . $order;
                else
                    $sql.=' ORDER BY ' . $order;
            }
        }

        if (($pagination = $this->getPagination()) !== false) {
            $pagination->setItemCount($this->getTotalItemCount());
            $limit = $pagination->getLimit();
            $offset = $pagination->getOffset();

            // update limit to the correct value for the last page 
            if ($offset + $limit > $pagination->getItemCount())
                $limit = $pagination->getItemCount() - $offset;

            $sql = $db->getCommandBuilder()->applyLimit($sql, $limit, $offset);
        }

        $command = $db->createCommand($sql);
        foreach ($this->params as $name => $value)
            $command->bindValue($name, $value);

        return $command->queryAll();
    }

}

この投稿のおかげです。

于 2015-04-07T14:49:02.663 に答える