最近一個項目,數據量有點大,使用分庫+分表存儲數據的,現在讀取數據需要用到分頁,有需要合併表。
寫了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裏面。我就懶得改了。
其實數據量大建議使用第一種,自己寫,用插件簡單點,但是效率可能沒那麼好,數據過大會出問題的哦,前期可以先用這個過度一下,後面再慢慢優化。