Heim  >  Artikel  >  php教程  >  Implementierung der Multi-Table-Assoziation und Multi-Table-Assoziationssuche von Yii2 ActiveRecord

Implementierung der Multi-Table-Assoziation und Multi-Table-Assoziationssuche von Yii2 ActiveRecord

高洛峰
高洛峰Original
2016-12-23 16:52:301332Durchsuche

Yiis ActiveRecord ist eine Klasse, die sich mit Datenbanken befasst. Dies ist das M (Modellebene) in MVC und das O (Objekt) von ORM.

Eine häufig gestellte Frage. Durch das Feedback in der Gruppe habe ich kürzlich das Gefühl gehabt, dass viele Menschen dieses Problem immer noch nicht verstehen. Heute habe ich dieses Problem klar erklärt. Werfen wir einen Blick auf die Multi-Table-Assoziation von yii2 ActiveRecord und wie man diese Assoziation optimiert.

Szenarioanforderungen:

Angenommen, wir haben eine Benutzertabelle user und eine Benutzerkanaltabelle auth. Die beiden Datentabellen sind eins zu eins über user.id und auth.uid verknüpft. Jetzt muss die Quellkanalquelle der Authentifizierungstabelle in der Benutzerliste angezeigt werden und der Kanal muss durchsuchbar sein.

Zuerst generieren wir über gii benutzer- und authentisierungsserienbezogene Modelle und Vorgänge. Für gii-Operationen wird hier keine detaillierte Beschreibung gegeben.

Ich denke, wir werden uns weiterhin mit den wichtigen Schritten befassen:

1. Suchen Sie die entsprechende AR-Modellklasse commonmodelsUser.php Verknüpfen Sie die Authentifizierungstabelle mit der Benutzertabelle

/**
* 关联auth表
*/
public function getAuth()
{
// hasOne要求返回两个参数 第一个参数是关联表的类名 第二个参数是两张表的关联关系
// 这里uid是auth表关联id, 关联user表的uid id是当前模型的主键id
return $this->hasOne(common\models\Auth::className(), ['uid' => 'id']);
}

in diesem Dateityp

Nach der Einrichtung bedeutet dies nicht, dass die beiden Daten Tabellen werden automatisch verknüpft! Wir besuchen die Benutzerlistenseite (die Listenseite wird von gii generiert, wir haben sie bisher noch nicht bearbeitet). Wenn wir die Datenbankabfragen durch Debuggen anzeigen, ist es nicht schwer festzustellen, dass die eigentliche Abfrage nicht mit der Authentifizierungstabelle verknüpft ist 🎜>

2. In der Rasteransicht das Quellkanalfeld source

<?= GridView::widget([
// other codes
&#39;columns&#39; => [
// other columns
&#39;auth.source&#39;,
]
]); ?>
in der Zuordnungstabelle .source hinzufügen?

Keine Sorge, jetzt öffnen wir Debug, um die eigentliche Abfrage zu sehen.

Wir werden feststellen, dass es viele Operationen wie „select * from `auth`“ gibt, wobei uid = xxx; ist. Wenn Ihr Paging standardmäßig 20 Daten enthält, gibt es 20 ähnliche Abfragen.

Lassen Sie uns zunächst herausfinden, was passiert ist?

Eigentlich handelt es sich hierbei um die Grundkenntnisse von PHP. Beim Lesen oder Schreiben einer nicht vorhandenen Mitgliedsvariablen eines Objekts werden automatisch die magischen Funktionen __get() __set() aufgerufen. Yii nutzt dies auch zur Umsetzung!

Dieser Vorgang ist fast derselbe wie die meisten Leute, die die Methode in Gridview kapseln, um verwandte Tabellendaten zu erhalten, aber! 20 SQL-Abfragen erhöhen offensichtlich den Overhead erheblich. Es wäre großartig, wenn dies eine Left-Join-Operation wäre!

3. SQL optimieren

Was wir optimieren müssen, ist:

20 SQL ändert sich in 1 SQL

Erhalten Sie nur die Felder, die für die zugehörige Tabelle erforderlich sind

Einige Schüler schreien: Hier ist die Operation, die mit Yii einhergeht, wie kann man sie optimieren? Wir kehren zur Erfassung von Datenquellen zurück und stellen fest, dass die Daten der Benutzerliste über die Suchmethode des userSearch-Modells bereitgestellt werden.

Das heißt, unsere Datenabfrage führt eigentlich keine entsprechende Tabellenabfrage durch! In diesem Fall fügen wir die zugehörige Abfrage

zu UserSearch

$query = User::find();
$query->joinWith([&#39;auth&#39;]);
$query->select("user.*, auth.source");
hinzu. Aktualisieren wir die Benutzerlistenseite erneut, und dann finden wir das dort durch eine Debug-Analyse Sind zwei SQL verursacht? Unsere Aufmerksamkeit

SELECT `user`.*, `auth`.`source` FROM `user` LEFT JOIN `auth` ON `user`.`id` = `auth`.`uid` LIMIT 20
SELECT * FROM `auth` WHERE `user_id` IN (20个uid);
Mit anderen Worten, wir haben das Ziel der Optimierung von SQL erreicht und festgestellt, dass die Abfragezeit von DB wurde stark reduziert.

4. Abfrage zu verwandten Tabellenfeldern hinzufügen

Das Suchmodell in Gridview wird auch über searchModel implementiert, das über Regeln steuert, welche Felder durchsuchbar sind und welche nicht.

Wir müssen nun die Quelle der Assoziationstabelle durchsuchbar machen, also definieren wir eine Attributquelle im Suchmodell und fügen sie den Regeln hinzu

public $source;
public function rules()
{
return [
// other rules
[&#39;source&#39;, &#39;safe&#39;],
];
}
Dann ändern wir die auth.source in der Gridview

// &#39;auth.source&#39;,
[
&#39;attribute&#39; => &#39;source&#39;,
&#39;value&#39; => &#39;auth.source&#39;,
&#39;label&#39; => &#39;渠道来源&#39;,
],
Zu diesem Zeitpunkt ist unsere Schnittstelle in Ordnung, aber wir müssen sie noch implementieren Suche im Programm. Einen Schritt entfernt können wir neue Quellbedingungen hinzufügen, unter denen die Datenquelle abgerufen wird

1, Objekt zu Array

$model = new ActiveRecord();

$model.toArray();

$query->andFilterWhere([
// other params
&#39;auth.source&#39; => $this->source,
]);
Da ActiveRecord kein einfaches Array ist, ist es kann nicht direkt json_encoded sein, da sonst die Informationen unvollständig sind.

Lösung: $model.toArray(); Dies verwandelt es in ein einfaches Array und kann json_encoded werden.

2. Rufen Sie die ActiveRecord-ID direkt über den Namen oder andere Felder ab.


Die Methode, die ich früher oft verwendet habe, ist (jetzt finde ich sie sehr langweilig):

$nIdcId = idc_info::model()->find(&#39;name like :name&#39;,array(&#39;:name&#39;=>"%".$strIdcName."%"))->id;
3. Verständnis des Modells

$idc = Idc::model()->find("...");
$id = $idc->id;
Das Obige ist die Einführung der Yii2 ActiveRecord-Mehrtabellenzuordnung und der Mehrtabellenzuordnung vom Herausgeber Ich hoffe, dass es Ihnen bei den relevanten Kenntnissen über die Implementierung der Tabellenzuordnungssuche hilfreich ist. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten. Ich möchte mich auch bei Ihnen allen für Ihre Unterstützung der chinesischen PHP-Website bedanken!

Weitere Artikel zur Implementierung der Multi-Table-Assoziation und Multi-Table-Assoziationssuche von Yii2 ActiveRecord 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