Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Verwendung von hasOne, hasMany und Many-to-many-bezogenen Abfragen in Yii2

Detaillierte Erläuterung der Verwendung von hasOne, hasMany und Many-to-many-bezogenen Abfragen in Yii2

不言
不言Original
2018-05-08 16:40:062259Durchsuche

Dieser Artikel stellt hauptsächlich die Verwendung von hasOne, hasMany und Many-to-many-bezogenen Abfragen in Yii2 vor. Jetzt kann ich ihn mit Ihnen teilen

Vorwort

hasOne und hasMany sind die einzigartigen Funktionen von Yii2 für Abfragen mit mehreren Tabellen. Es wird empfohlen, sie bei Abfragen mit mehreren Tabellen zu verwenden. Warum? Da die Ergebnisse verwandter Abfragen auf diese Weise die eigene Header-Sortierfunktion sowie den ID-Speicherwert der Eingabe in CheckboxColumn beibehalten, muss jeder herausfinden, ob es weitere Vorteile gibt Bisher ein gemeinsamer Vorteil. Es gibt keine anderen verwandten Abfragen, wie z. B. eine yiidbQuery-Abfrage oder eine native SQL-Anweisungsabfrage. Wenn die Abfrage in der Liste angezeigt wird, ist die Kopfzeile der Tabelle schwarz.

Yii2s hasOne und hasMany Abfragen mit mehreren Tabellen, egal ob es sich um ein Dokument oder einen Artikel handelt, können den Referenzmaster tatsächlich leicht finden. Aber warum hat der Autor diesen Artikel eigentlich sehr einfach geschrieben? In den vorherigen Informationen habe ich die Verwendung von Many-to-Many-Abfragen nicht gesehen. Ich werde mich oder andere nicht wiederholen. Der Schwerpunkt dieses Artikels liegt auf der Verwendung von Many-to-Many-bezogenen Abfragen, um Ihr Wissen zu erweitern.

Anforderungsanalyse

1 Verwenden Sie eine Abfrageanweisung, um alle Daten in der Liste eins zu eins anzuzeigen. Eins-zu-Eins-Viele- und Viele-zu-Viele-Beziehungen.

2. Die eigene Header-Sortierfunktion von Yii2 und der ID-Speicherwert der Eingabe in CheckboxColumn können nicht zerstört werden.

Rendering

1. Eins-zu-eins, eins-zu-viele, viele-zu-viele, Header-Sortierung.

2. Der ID-Wert der Eingabe in CheckboxColumn.

Code-Analyse

Many-to-many

Beispiel: Ein Kunde kann mehrere Labels haben und ein Label kann für mehrere Kunden gelten.

1. Fügen Sie den folgenden Code zu TSales (dem Modell der Kundentabelle) hinzu:

 public function getcommon_tag()
 { 
  return $this->hasMany(CommonTag::className(), ['itemid' => 't_id'])->onCondition(['idtype' => "内容"])->joinWith(['tag']);    
 }

Hinweis: Die common_tag-Tabelle hier ist eine Zwischentabelle, common_tag Nachdem die Zwischentabelle mithilfe von hasMany mit der Kundentabelle verknüpft wurde, muss am Ende joinWith(['tag']) hinzugefügt werden, um die Tag-Tabelle zuzuordnen. onCondition ist eine Methode mit zusätzlichen Bedingungen.

2. Fügen Sie den folgenden Code zum CommonTag (Zwischentabellenmodell) hinzu, um die Tag-Tabelle zuzuordnen. Verwenden Sie einfach hasOne.

public function gettag()
{ 
 return $this->hasOne(Tag::className(), ['id'=>'tagid']);
}

3. Fügen Sie den folgenden Code zu TSalesSearch (Suchmodell des Kunden) hinzu, um die Zwischentabelle common_tag zu verknüpfen: $query->joinWith(['common_tag' ] );

4. Der Seitenausgabecode lautet wie folgt:

[
 'attribute' => 'tag_id',
 'value' => function ($model) { 
  $_tag=$model->getRelatedRecords()['common_tag'];
  if(!empty($_tag)){
   $tagName="";
   foreach ($_tag as $key => $value) {                        $tagName.=$value['tag']['name'].'/';
   }
   return rtrim($tagName,'/');
  } 
 },
],

Hinweis: $model->getRelatedRecords() wird verwendet um [_related :yiidbBaseActiveRecord:private] den Wert des Arrays zu erhalten.

Eins-zu-viele

1. hasMany ist an der vorherigen Viele-zu-Viele-Nutzung beteiligt, um eine Eins-zu-Viele-Nutzung zu erreichen -many, entfernen Sie einfach den JoinWith am Ende. Die anderen Konfigurationen und Ausgabemethoden sind gleich.

Eins-zu-eins

1. Die Eins-zu-Eins-Nutzung ist ebenfalls eine Eins-zu-Eins-Nutzung das Gleiche wie hasMany, daher besteht hier keine Notwendigkeit.

Hinweise

1. Wenn der Wert aus der zugehörigen Abfrage nicht mit der folgenden Codeausgabe (common_tag.name) abgerufen werden kann, bedeutet das Ihre Kundentabelle sollte dieses Namensfeld haben und der Wert ist leer. Nach der Wiederholung des Namens werden zuerst die Felder der Haupttabelle ausgegeben. Die Lösung lautet: $model->getRelatedRecords().

 [
 'attribute' => 'tag_id',
 'value' => 'common_tag.name'
 ]

Verwandte Empfehlungen:

Yii2-Methode zur Implementierung der gleichzeitigen Suche in mehreren Feldern


Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung von hasOne, hasMany und Many-to-many-bezogenen Abfragen in Yii2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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