Yii CSqlDataProvider() 和 MSSQL - 最后一页错误
Yii CSqlDataProvider() and MSSQL - last page bug
我正在使用 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 版本,因为这是在 Yii 从 1.1.8 升级之前工作的
还有一件事,我正在使用 MSSQL
(Microsoft SQL) 数据库来提供数据
这似乎是 Yii framework issue 和 MSSQL
,这是解决方案之一,覆盖 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();
}
}
感谢 this post。
我正在使用 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 版本,因为这是在 Yii 从 1.1.8 升级之前工作的
还有一件事,我正在使用 MSSQL
(Microsoft SQL) 数据库来提供数据
这似乎是 Yii framework issue 和 MSSQL
,这是解决方案之一,覆盖 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();
}
}
感谢 this post。