本篇文章主要介紹了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就可以這樣使用來展示統計數據
<?= GridView::widget([ 'dataProvider' => $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
<?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ //其他列 [ 'label' => '统计数据', 'attribute' => 'data', 'value' => function($model){ return isset($model->stat->data) ? $model->stat->data : null; } ], //其他列 ], ]); ?>
於是就會報出這樣一個錯誤:
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() 方法就可以了。
<?php $form = ActiveForm::begin(); ?> //其他列 <?= $form->field($model, 'data')?> //其他列 <p class="form-group"> <?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?> </p> <?php ActiveForm::end(); ?>
// 默认是这样的 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中文網!