<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. 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

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人