Yii2 implémente le code de la fonction de tri des requêtes liée à la base de données MySQL

高洛峰
Libérer: 2023-03-05 18:42:02
original
1628 Les gens l'ont consulté

Cet article présente principalement un exemple d'implémentation par Yii2 de la fonction de tri des requêtes liées à la base de données MySQL. Il a une certaine valeur de référence et les amis intéressés peuvent s'y référer.

Contexte : Il y a deux bases de données sur un serveur mysql (remarque : les deux bases de données doivent être sur le même serveur mysql) :

Il y a une table utilisateur en mémoire (table de données régulière de stockage) (Enregistrement des informations utilisateur)

Il y a un user_stat dans memory_stat (stockage de la table de données statistiques) (Enregistrement des données statistiques utilisateur)

Maintenant, le user_stat dans la liste GridView générée par la table utilisateur s'affiche Données statistiques

Ajoutez simplement l'association dans la classe Modèle utilisateur

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

Vous pouvez le faire dans GridView Utilisé pour afficher les données statistiques

<?= 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;
   }
  ],
  
  //其他列
 ],
]); ?>
Copier après la connexion

Maintenant, une exigence a été ajoutée pour trier et filtrer les données statistiques dans la liste GridView de l'utilisateur

Si les tables user et user_stat sont dans la même base de données, nous pouvons faire ceci :

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;
}
Copier après la connexion

Vous pouvez l'utiliser dans GridView pour afficher des données statistiques et les trier

<?= 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;
   }
  ],
  
  //其他列
 ],
]); ?>
Copier après la connexion

Ajoutez les colonnes suivantes au formulaire de recherche Vous pouvez filtrer

<?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(); ?>
Copier après la connexion

Cependant, la réalité est cruelle, les tables user et user_stat sont sous la même base de données.

Ensuite, une telle erreur sera signalée :

SQLSTATE[42S02] : Table de base ou vue introuvable : 1146 La table 'memory.user_stat' n'existe pas
Le Le SQL en cours d'exécution était : ...

Pour effectuer une requête de données associées sur deux bases de données (même serveur), l'instruction SQL pure est la suivante :


Copier le code Le code est le suivant :


sélectionnez a.*,b.* depuis memory.user comme a,memory_stat.user_stat comme b où a.id =b .user_id;


Yii2 n'ajoutera pas le nom de la base de données avant l'instruction par défaut lors de sa conversion en instruction SQL, donc mysql utilisera par défaut cette table lors de l'exécution de l'instruction SQL sous la base de données mémoire.


Copier le code Le code est le suivant :


sélectionnez a.*,b.* dans memory.user as a, memory.user_stat as b où a.id=b.user_id;


Le message d'erreur ci-dessus apparaît donc.

Alors, comment résoudre ce problème ?

En fait, c'est très simple. Il vous suffit de remplacer la méthode tableName() sous la classe modèle de user_stat.

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

public static function getDb()
{
 return Yii::$app->get(&#39;dbStat&#39;);
}
Copier après la connexion

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

public static function getDb()
{
 return Yii::$app->get(&#39;dbStat&#39;);
}
Copier après la connexion

// 为了提高代码稳定性,可以这样写
public static function tableName()
{
 preg_match("/dbname=([^;]+)/i", static::getDb()->dsn, $matches);
 return $matches[1].&#39;.user_stat&#39;;
}

public static function getDb()
{
 return Yii::$app->get(&#39;dbStat&#39;);
}
Copier après la connexion

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois.

Pour plus d'articles sur l'implémentation Yii2 de la fonction de tri des requêtes liées aux bases de données cross-mysql, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal