yii2 ActiveDataProvider 多數據庫,合併表分頁處理

最近一個項目,數據量有點大,使用分庫+分表存儲數據的,現在讀取數據需要用到分頁,有需要合併表。

寫了2個方案:

一個是分頁功能全部重寫了,沒有用yii2自帶的分頁數據處理插件:

先計算出條件範圍內總共使用哪幾個表。我是按時間查詢的,所以如果是多個表只對第一個表條件時間大於起始時間,最後一個表時間小於結束時間(單表就沒有這麼多事情了)。

計算出每個表數據量。加起來爲總數據。結果除以每頁顯示數據得到總頁碼

按偏移量(頁碼*每頁顯示數據)得到數據再哪個表,直接到對應表查詢數據並顯示,如果在多個表,每個一不分數據,先取第一個表的數據,然後對比第二表總數據和剩餘數據量,進行迭代處理(其實正常情況肯定是隻會存在2個表,不會大於2個表)。

然後使用一個單獨的分頁插件就好數據自己拼接。分頁插件view頁面寫法

// 顯示分頁
            echo \yii\widgets\LinkPager::widget([
                'pagination' => $pagination,
                'firstPageLabel' => '首頁',
                'lastPageLabel' => '尾頁',
            ]);

第二個是偷懶的辦法,直接使用 ActiveDataProvider 分頁:

這個插件,查看源代碼可以發現是可以設置數據庫的,寫法很簡單

$dataProvider = new ActiveDataProvider([
            'query' => $query,
            'db' => db1,
            'sort' => [
                'defaultOrder' => [
                    'id' => SORT_DESC,
                ],
            ],
        ]);

直接寫db就可以了,這個是數據庫問題。

然後是多個表合併一個的問題,可以使用union,

$data = new Data();
$queryAll = $data->find()->from($tableList[0]);
for ($j = 1; $j < $ct; $j++){
  $data = new Data();
  $query = $data->find()->from($tableList[$j]);
  $queryAll = $queryAll->union($query);
}

$query = (new Query())->from([$queryAll])

這樣得到的query可以正常分頁使用。

對啦上面的Data()是分表數據的model,是動態表明,網上有很多寫法,可以自行百度一下。或者看我的另一個文章寫的:https://blog.csdn.net/u012533474/article/details/86362598

後面加from對象是query對象中實際上是沒有把表名稱記住,必須寫到from裏面,不然表不對的哦,然後就得不到數據,當然如果你寫的Data模型可以實現的話,也可以不用寫這裏,寫到Data裏面。我就懶得改了。

 

其實數據量大建議使用第一種,自己寫,用插件簡單點,但是效率可能沒那麼好,數據過大會出問題的哦,前期可以先用這個過度一下,後面再慢慢優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章