Yii2實作跨mysql資料庫關聯查詢排序功能碼

高洛峰
發布: 2023-03-05 18:42:02
原創
1534 人瀏覽過

本篇文章主要介紹了Yii2實作跨mysql資料庫關聯查詢排序功能範例,具有一定的參考價值,有興趣的小夥伴們可以參考一下。

背景:在一個mysql伺服器上(注意:兩個資料庫必須在同一個mysql伺服器上)有兩個資料庫:

memory (儲存常規資料表) 中有一個user 表(記錄使用者資訊)

memory_stat (存儲統計數據表) 中有一個user_stat (記錄用戶統計數據)

現在在user 表生成的GridView 列表中展示user_stat 中的統計數據

只需要在User的model類中添加關聯

public function getStat() { return $this->hasOne(UserStat::className(), ['user_id' => 'id']); }
登入後複製

在GridView就可以這樣使用來展示統計數據

 $dataProvider, 'columns' => [ //其他列 [ 'label' => '统计数据', 'value' => function($model){ return isset($model->stat->data) ? $model->stat->data : null; } ], //其他列 ], ]); ?>
登入後複製

現在增加了一個需求,需要在若蟲 GridView 列表中對統計資料進行排序和篩選和排序
?在同一個資料庫下我們可以這樣做:

UserSearch:


public $data; public function rules() {/*{{{*/ return [ ['data'], 'integer'], //其他列 ]; }/*}}}*/ public function search($params, $onlyActiveUsers = false) { $query = User::find(); $query->joinWith(['stat']); $dataProvider = new ActiveDataProvider([ 'query' => $query, 'sort' => [ 'attributes' => [ //其他列 'data' => [ 'asc' => [UserStat::tableName() . '.data' => SORT_ASC], 'desc' => [UserStat::tableName() . '.data' => SORT_DESC], ], //其他列 ], 'defaultOrder' => [ 'id' => SORT_DESC, ], ], 'pagination' => [ 'pageSize' => 50, ], ]); $this->load($params); if (!$this->validate()) { $query->where('0=1'); return $dataProvider; } $query->filterWhere([ //其他列 UserStat::tableName() . '.data' => $this->data ]); return $dataProvider; }
登入後複製

在GridView就可以這樣使用來展示統計資料,就可以排序了


search

reee欄位就可以篩選了

 $dataProvider, 'columns' => [ //其他列 [ 'label' => '统计数据', 'attribute' => 'data', 'value' => function($model){ return isset($model->stat->data) ? $model->stat->data : null; } ], //其他列 ], ]); ?>
登入後複製


然而現實是殘酷的, user 和user_stat 表並在同一個資料庫下。

於是就會報出這樣一個錯誤:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'memory.user_stat' doesn't exist
The SQL being要在兩個數據庫(同一台服務器)上進行關聯數據查詢,純SQL語句如下:



複製代碼

代碼如下:

select a.*,b.* from memory.user as a ,memory_stat.user_stat as b where a.id=b.user_id;

Yii2轉換成SQL 語句時預設不會在表示前新增資料庫名,所以mysql在執行sql語句時就會預設此表在表示前面memory資料庫下。




複製程式碼

程式碼如下:

select a.*,b.* from memory.user as a,memory.user_stat as bere a.id=b.b.於是就出現了以上報錯訊息。

那麼,如何來解決這個問題呢?

其實很簡單,只要重寫 user_stat 的 model 類別下的 tableName() 方法就可以了。


 //其他列 field($model, 'data')?> //其他列 

'btn btn-primary']) ?>

登入後複製


// 默认是这样的 public static function tableName() { return 'user_stat'; } public static function getDb() { return Yii::$app->get('dbStat'); }
登入後複製

// 只需要在表明前添加数据库名 public static function tableName() { return 'memory_stat.user_stat'; } public static function getDb() { return Yii::$app->get('dbStat'); }
登入後複製


以上就是本文的全部內容,希望對大家網絡的學習多多支持。

更多Yii2實現跨mysql資料庫關聯查詢排序功能代碼相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!