ホームページ  >  記事  >  バックエンド開発  >  Yii2 は、クロス MySQL データベース関連のクエリソート関数コードを実装します

Yii2 は、クロス MySQL データベース関連のクエリソート関数コードを実装します

高洛峰
高洛峰オリジナル
2017-02-15 15:34:211608ブラウズ

この記事では主に Yii2 のクロス mysql データベース関連のクエリソート機能の実装例を紹介します。一定の参考値があるので、興味のある方は参考にしてください。

背景: mysql サーバー上に 2 つのデータベースがあります (注: 2 つのデータベースは同じ mysql サーバー上にある必要があります):

memory (通常のデータテーブルを保存) ユーザーテーブルがある (ユーザー情報を記録する)

memory_stat (ストレージ統計テーブル) user_stat (ユーザー統計を記録する) があります

これで、user_stat の統計データがユーザーテーブルによって生成された GridView リストに表示されます

User モデル クラスに関連付けを追加するだけです

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

これを使用して、GridView で統計データを表示できます

<?= GridView::widget([
 &#39;dataProvider&#39; => $dataProvider,
 &#39;columns&#39; => [

  //其他列
  
  [
   &#39;label&#39; => &#39;统计数据&#39;,
   &#39;value&#39; => function($model){
    return isset($model->stat->data) ? $model->stat->data : null;
   }
  ],
  
  //其他列
 ],
]); ?>

今度は、ユーザーの GridView リストで統計データを並べ替えてフィルタリングする必要があります

user テーブルと user_stat テーブルの場合同じデータベースでこれを行うことができます:

UserSearch:

public $data;
public function rules()
{/*{{{*/
 return [
  [&#39;data&#39;], &#39;integer&#39;],
  //其他列
 ];
}/*}}}*/

public function search($params, $onlyActiveUsers = false)
{
 $query = User::find();
 $query->joinWith([&#39;stat&#39;]);

 $dataProvider = new ActiveDataProvider([
  &#39;query&#39; => $query,
  &#39;sort&#39; => [
   &#39;attributes&#39; => [
    //其他列
    
    &#39;data&#39; => [
     &#39;asc&#39; => [UserStat::tableName() . &#39;.data&#39; => SORT_ASC],
     &#39;desc&#39; => [UserStat::tableName() . &#39;.data&#39; => SORT_DESC],
    ],
    
    //其他列
   ],
   &#39;defaultOrder&#39; => [
    &#39;id&#39; => SORT_DESC,
   ],
  ],
  &#39;pagination&#39; => [
   &#39;pageSize&#39; => 50,
  ],
 ]);

 $this->load($params);

 if (!$this->validate()) {
  $query->where(&#39;0=1&#39;);
  return $dataProvider;
 }

 $query->filterWhere([
 
  //其他列
  
  UserStat::tableName() . &#39;.data&#39; => $this->data
 ]);

 return $dataProvider;
}

これを GridView で使用して統計データを表示し、並べ替えることができます

<?= GridView::widget([
 &#39;dataProvider&#39; => $dataProvider,
 &#39;columns&#39; => [

  //其他列
  
  [
   &#39;label&#39; => &#39;统计数据&#39;,
   &#39;attribute&#39; => &#39;data&#39;,
   &#39;value&#39; => 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 own

実行されている SQL は: ...


2 つのデータベース (同じサーバー) で関連データのクエリを実行するための純粋な 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 ステートメントを実行するときに使用されます。


コードをコピー

コードは次のとおりです:


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

そのため、上記のエラーメッセージが表示されました。

それでは、この問題をどうやって解決すればいいのでしょうか?

実際、これは非常に簡単です。 user_stat のモデル クラスで tableName() メソッドをオーバーライドするだけです。

<?php $form = ActiveForm::begin(); ?>
//其他列 

<?= $form->field($model, &#39;data&#39;)?>

//其他列
<p class="form-group">
 <?= Html::submitButton(&#39;Search&#39;, [&#39;class&#39; => &#39;btn btn-primary&#39;]) ?>
</p>

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


// 默认是这样的
public static function tableName()
{
 return &#39;user_stat&#39;;
}

public static function getDb()
{
 return Yii::$app->get(&#39;dbStat&#39;);
}

// 只需要在表明前添加数据库名
public static function tableName()
{
 return &#39;memory_stat.user_stat&#39;;
}

public static function getDb()
{
 return Yii::$app->get(&#39;dbStat&#39;);
}

以上がこの記事の全内容であり、皆様の学習に役立つことを願っておりますので、皆様もPHP中国語ウェブサイトをご支援いただければ幸いです。

クロス MySQL データベース関連の Yii2 実装関連のクエリソート関数コード関連の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。