2013-04-30 67 views
1

分頁我有兩個數據源Yii的CGridView - 顯示和兩個來源

1) Database 
2) Memcached or Totally different database 

從1日的數據庫我收到組成員列表ID(擁有超過10000行)並獲得我查詢列表之後第二個數據庫或打Memcached中獲得實際的細節

$connection = Yii::app()->db; 
$sql = 'select user_id,joined_date from group_data where group_id=:group_id '; 

$dataProvider = new CSqlDataProvider($sql, array(
        'keyField' => 'user_id', 
        'sort' => array(
         'attributes' => array(
          'user_id', 
          'joined_date' 
         ), 
         'defaultOrder'=>array(
         'user_id ASC', 
         ) 
        ), 
        'pagination' => array(
         'pageSize' => 30, 
        ), 
        'totalItemCount' => $count, 
       )); 


$connection_master = Yii::app()->masterdb; 

在上面的數據提供者,我不知道如何將我的第二個數據庫並獲取實際的用戶名,因爲它是在其他數據庫。沒有直接連接一個數據庫到其他。

這裏的問題是分頁是基於第一個數據庫表(每頁30條記錄),實際數據來自第二個表。

關於如何實現這個的任何想法?

謝謝

回答

1

你可以建立自己的自定義數據提供程序類。您可以從CDataProvider擴展它,並實現丟失abstract方法:

abstract protected function fetchData(); 
abstract protected function fetchKeys(); 
abstract protected function calculateTotalItemCount(); 

注意,你的存儲模型已經非常接近這些方法:您存儲在一個數據庫中的ID,而在另一個實際的數據。因此,您可以在每種方法中同時關注一個數據庫。

你會從fetchKeys()開始。你需要從你的第二個數據庫中查詢關鍵字(= ID)。看看CSqlDataProvider::fetchData(),看看如何使用$this->getPagination()中的CPagination對象找出當前的limitoffset。如果你需要排序,你還可以檢查CSort對象$this->getSort()當前的排序設置。有了這些可用的數據,您應該能夠在當前請求的結果頁面上爲ID生成查詢。您可以通過$this->getKeys()獲得這些密鑰。你不應該直接調用fetchKeys(),因爲getKeys()fetchKeys()得到的結果是「緩存的」,所以如果它稍後在相同的請求中被再次調用,將不會有另一個查詢。使用這些密鑰,您現在可以輕鬆查詢您的主數據庫。結果將表示當前頁面上的行。

最後你必須執行calculateTotalItemCount()。這很容易:只需查詢您的第二個數據庫中的項目總數。

這就是你需要做的 - 基礎CDataProvider類中的代碼將負責其餘部分並根據需要調用你的方法。

+0

感謝您的詳細解答。我將嘗試實現這一點。對於排序,我有一個問題。我擁有的最大密鑰是其中一個組的133942,相當於1 MB數據。爲了對這個組的用戶名進行排序,我必須首先獲取密鑰,並且必須獲取數據並且必須對數據進行排序。我只是試了這個放入子句,並得到了max_allowed_pa​​cket錯誤(值是1 GB):)。沒有得到理想的分揀解決方案..再次感謝 – Bujji 2013-04-30 16:47:22