2015-04-05 91 views
0

我使用Yii 1.1.16和CSqlDataProvider()來顯示CGridView中的數據。當轉到最後一頁時,我得到最後一頁PageSize計數記錄,而不是最後一頁上的記錄數。例如,我有12個記錄的網格,PageSize設置爲10,這意味着我有2個頁面,所以在頁面1上,我從1 - 10獲得記錄,但是在第2頁(最後一頁)我獲得3-12記錄!Yii CSqlDataProvider()和MSSQL - 最後一頁錯誤

這是價值觀,我得到的每一頁

//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(微軟SQL)數據庫提供數據

回答

1

看起來這是Yii framework issueMSSQL這裏是解決方案之一,覆蓋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崗位。