Heim  >  Artikel  >  Backend-Entwicklung  >  Yii2 implementiert den Funktionscode für die Abfragesortierung im Zusammenhang mit MySQL-Datenbanken

Yii2 implementiert den Funktionscode für die Abfragesortierung im Zusammenhang mit MySQL-Datenbanken

高洛峰
高洛峰Original
2017-02-15 15:34:211611Durchsuche

In diesem Artikel wird hauptsächlich das Beispiel der Implementierung einer mysql-datenbankbezogenen Abfragesortierfunktion durch Yii2 vorgestellt. Es hat einen gewissen Referenzwert und interessierte Freunde können darauf verweisen.

Hintergrund: Es gibt zwei Datenbanken auf einem MySQL-Server (Hinweis: Die beiden Datenbanken müssen sich auf demselben MySQL-Server befinden):

Es gibt eine Benutzertabelle im Speicher (in der reguläre Datentabellen gespeichert sind). ) (Aufzeichnen von Benutzerinformationen)

Es gibt ein user_stat in „memory_stat“ (Tabelle mit statistischen Daten speichern) (Aufzeichnen von statistischen Benutzerdaten)

Jetzt das user_stat in der vom Benutzer generierten GridView-Liste Tabelle wird angezeigt. Statistische Daten

Fügen Sie einfach die Zuordnung in der Modellklasse des Benutzers hinzu

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

Das können Sie tun this in GridView Wird zum Anzeigen statistischer Daten verwendet

<?= 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;
   }
  ],
  
  //其他列
 ],
]); ?>

Jetzt wurde eine Anforderung hinzugefügt, statistische Daten in der Benutzer-GridView-Liste zu sortieren und zu filtern

Wenn sich die Tabellen „user“ und „user_stat“ in derselben Datenbank befinden, können wir Folgendes tun:

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;
}

Sie können dies in GridView verwenden, um statistische Daten anzuzeigen und zu sortieren

<?= 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;
   }
  ],
  
  //其他列
 ],
]); ?>

Fügen Sie der Suche die folgenden Spalten hinzu Formular Sie können filtern

<?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(); ?>

Die Realität ist jedoch grausam, die Tabellen user und user_stat befinden sich in derselben Datenbank.

Dann wird ein solcher Fehler gemeldet:

SQLSTATE[42S02]: Basistabelle oder Ansicht nicht gefunden: 1146 Tabelle 'memory.user_stat' existiert nicht
Der SQL wurde ausgeführt: ...

Um verwandte Datenabfragen auf zwei Datenbanken (dem gleichen Server) durchzuführen, lautet die reine SQL-Anweisung wie folgt:


Code kopieren Der Code lautet wie folgt:


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


Yii2 fügt den Datenbanknamen standardmäßig nicht vor der Anweisung hinzu, wenn es in eine SQL-Anweisung konvertiert wird, sodass MySQL standardmäßig diese Tabelle verwendet beim Ausführen der SQL-Anweisung unter der Speicherdatenbank.


Code kopieren Der Code lautet wie folgt:


wählen Sie a.*,b.* aus dem Speicher.Benutzer aus as a, memory.user_stat as b where a.id=b.user_id;


Die obige Fehlermeldung erscheint also.

Wie kann man dieses Problem lösen?

Tatsächlich ist es sehr einfach, die Methode tableName() unter der Modellklasse user_stat zu überschreiben.

// 默认是这样的
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;);
}

// 为了提高代码稳定性,可以这样写
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;);
}

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.

Weitere Artikel zu Yii2-Implementierung von Cross-MySQL-Datenbank-bezogenen Abfragesortierfunktionscodes finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn