<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            php語言

            Yii2如何實現跨mysql數據庫關聯查詢排序

            時間:2025-04-30 02:19:05 php語言 我要投稿
            • 相關推薦

            Yii2如何實現跨mysql數據庫關聯查詢排序

              導語: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;

              }

              ],

              //其他列

              ],

              ]); ?>

              現在增加了一個需求,需要在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;

              }

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

              <?= GridView::widget([

              'dataProvider' => $dataProvider,

              'columns' => [

              //其他列

              [

              'label' => '統計數據',

              'attribute' => 'data',

              'value' => function($model){

              return isset($model->stat->data) ? $model->stat->data : null;

              }

              ],

              //其他列

              ],

              ]); ?>

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

              <?php $form = ActiveForm::begin(); ?>

              //其他列

              <?= $form->field($model, 'data')?>

              //其他列

              <p class="form-group">

              <?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>

              </p>

              <?php ActiveForm::end(); ?>

              然而現實是殘酷的, user 和 user_stat 表并在同一個數據庫下。

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

              SQLSTATE[42S02]: Base table or view not found: 1146 Table 'memory.user_stat' doesn't exist

              The SQL being executed was: ...

              要在兩個數據庫(同一臺服務器)上進行關聯數據查詢,純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 b where a.id=b.user_id;

              于是就出現了以上報錯信息。

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

              其實很簡單,只需要重寫 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');

              }

              // 為了提高代碼穩定性,可以這樣寫

              public static function tableName()

              {

              preg_match("/dbname=([^;]+)/i", static::getDb()->dsn, $matches);

              return $matches[1].'.user_stat';

              }

              public static function getDb()

              {

              return Yii::$app->get('dbStat');

              }

            【Yii2如何實現跨mysql數據庫關聯查詢排序】相關文章:

            PHP 中 MySQL 數據庫異步查詢實現08-22

            如何實現yii2 數據庫讀寫分離配置07-01

            如何實現歸并排序10-04

            php如何實現快速排序09-18

            php基礎之連接mysql數據庫和查詢數據07-30

            關于php操作mysql執行數據庫查詢08-11

            PHP獲取MySQL數據庫里所有表的實現代碼08-27

            PHP與MYSql連接與查詢06-19

            php查詢mysql的實例09-09

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院