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

來源:互聯網
上載者:User

標籤:統計   col   model   https   必須   get   現在   btn   segment   

遇到一個項目,需要跨表網上找了很多的資料,整理一下,方便以後再次使用

背景:在一個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::widget([                ‘dataProvider‘ => $dataProvider,                // ‘filterModel‘ => $searchModel,                ‘columns‘ => [//                    [‘class‘ => ‘yii\grid\SerialColumn‘],                     [                                                  ‘label‘ => ‘資料統計‘,              ‘attrube‘=>‘data‘ //輸入對應的                            ‘value‘ => ‘stat.data‘                     ],                                                            [‘class‘ => ‘yii\grid\ActionColumn‘],                ],            ]); ?>

 

現在增加了一個需求,需要在user GridView 列表中對統計資料進行排序和篩選

若 user 和 user_stat 表在同一個資料庫下我們可以這樣做:

  • 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;}

 

search 表單中添加以下列就可以篩選了

<?php $form = ActiveForm::begin(); ?>//其他列 <?= $form->field($model, ‘data‘)?>//其他列<div class="form-group">    <?= Html::submitButton(‘Search‘, [‘class‘ => ‘btn btn-primary‘]) ?></div><?php ActiveForm::end(); ?>
那麼,如何來解決這個問題呢?
  • 其實很簡單,只需要重寫 user_stat 的 model 類下的 tableName() 方法就可以了。

// 預設是這樣的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‘);}

 

轉載:1190000008107267

侵刪!!!

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.