Maison > Article > développement back-end > Yii2 implémente le code de la fonction de tri des requêtes liée à la base de données MySQL
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']); }
Vous pouvez le faire dans GridView Utilisé pour afficher les données statistiques
<?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ //其他列 [ 'label' => '统计数据', 'value' => function($model){ return isset($model->stat->data) ? $model->stat->data : null; } ], //其他列 ], ]); ?>
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 [ ['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; }
Vous pouvez l'utiliser dans GridView pour afficher des données statistiques et les trier
<?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ //其他列 [ 'label' => '统计数据', 'attribute' => 'data', 'value' => function($model){ return isset($model->stat->data) ? $model->stat->data : null; } ], //其他列 ], ]); ?>
Ajoutez les colonnes suivantes au formulaire de recherche Vous pouvez filtrer
<?php $form = ActiveForm::begin(); ?> //其他列 <?= $form->field($model, 'data')?> //其他列 <p class="form-group"> <?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?> </p> <?php ActiveForm::end(); ?>
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 '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'); }
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 !