Heim  >  Artikel  >  PHP-Framework  >  Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

咔咔
咔咔Original
2021-01-08 10:41:211971Durchsuche
"

Wir haben oben über die ThinkPHPDatenbankabfrage-DB-Methode gesprochen. Heute werden wir kurz über die Implementierung der Model-Klasse sprechen.

"

Vorwort

.

Modell Dies ist das im Framework erwähnte Modellkonzept, und diese Verwendung macht den größten Teil der Framework-Nutzung aus.

Als nächstes wird Kaka weiterhin eine eingehende Analyse des Modells auf der Grundlage des oben Gesagten durchführen. Bereiten Sie also jetzt Ihre Bank vor und essen Sie einige Melonenkerne, um diesen Artikel zu lesen!

Das oben bereitgestellte Ausführungsflussdiagramm der Db-Klasse ist ebenfalls für Sie freigegeben, damit Sie sich damit vertraut machen können.

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Db-Klassenausführungsprozess

1. Werfen Sie einen kurzen Blick auf einige Nutzungsdateien des Modells

Das Modellverzeichnis muss im Modulverzeichnis vorhanden sein

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Modellverzeichnis

Gehen Sie dann zur untersten Ebene des Frameworks und Sie können die Dateien zur Modellklasse sehen. In dieser Klasse werden zwei Wissenspunkte verwendet, die wir zuvor gelernt haben.

Die erste besteht darin, dass ArrayAccess auf die Eigenschaften eines Objekts zugreift, genau wie auf ein Array.

Die zweite Funktion ist die Superklasse (Trait), die tatsächlich eine Funktion ähnlich der Mehrfachvererbung implementiert. Beachten Sie jedoch, dass PHP keine Mehrfachvererbung hat und die beiden Konzepte nicht verwechselt werden können.

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Die unterste Ebene des Modellklassen-Frameworks

Dann gibt es auch einen Modellordner am unteren Rand des Frameworks, der ebenfalls dieselben Funktionen wie die Db-Klasse verwendet.

Zum Beispiel Konnektoren, Abfragen, Generatoren

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Grundlegende Dateien von Modellklassen

Nach einem kurzen Verständnis müssen wir einen Fall im Modell analysieren, nur für die Implementierung eines Falles!

2. Analyse des neuen Logikquellcodes in der Modellszenarioanalyse

In diesem Fall werden die neuen Ergänzungen im Modell als Fallanalyse verwendet und eine eingehende Analyse des Quellcodes durchgeführt.

Zuerst müssen Sie die Modelldatei erstellen, um Dateien immer über die Befehlszeile zu erstellen. Der Vorteil der Verwendung der Befehlszeile zum Erstellen von Dateien besteht darin, dass Sie beim Erstellen von Dateien keine Fehler mit dem Namespace machen.

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Erstellen Sie die Modelldatei.

Implementieren Sie dann die erste Funktion und fügen Sie sie mit dem Modell hinzu. Der Inhalt dieses Teils ist sehr einfach Die Hauptaufgabe besteht darin, den Implementierungsprozess für alle zu analysieren.

Der Fall im Controller ist wie folgt: Achten Sie hier auf die Schreibweise von Kaka.

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Fallimplementierung im Controller

Lassen Sie mich kurz darüber sprechen, warum Kaka es so schreibt und welche Vorteile es hat, es so zu schreiben.

Zunächst ist es wichtig, die Modellklasse vorzustellen.

Dann wird eine Variable deklariert

Der letzte Schritt besteht darin, die Modellklasse der deklarierten Variablen zuzuweisen, wenn der Controller initialisiert wird.

Verwenden Sie dann bei der Verwendung einfach die deklarierte Variable. Der Vorteil besteht darin, dass die Menge des geänderten Codes reduziert werden kann, wenn Ihr Modellname später in Konflikt steht.

Sie können sich ein Szenario vorstellen, in dem Sie einen Modellnamen vordefinieren und ihn später ändern möchten. Wenn Sie zu diesem Zeitpunkt der Schreibmethode von Kaka folgen, benötigen Sie nur den Inhalt in der Controller-Initialisierung , kann dies in einer Codezeile erfolgen.

Ansonsten muss der gesamte Code geändert werden, weshalb Kaka ihn so schreibt.

Lass es uns zuerst ausführen und die Ausführungsergebnisse sehen.

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Ausführungsergebnisse

Anhand der Ergebnisse im obigen Bild können wir erkennen, dass es kein Problem mit der Codelogik gibt. Als nächstes werden wir eine eingehende Analyse der Speichermethode durchführen, um den Unterschied zwischen ihnen zu erkennen die Ausführungsmethoden des Modells und der Db-Klasse.

Eingehende Analyse der Speichermethode

Zunächst müssen Sie verstehen, in welche Datei dieser Code ausgeführt wird.

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Durch das Parsen dieser Codezeile wird diese Datei ausgeführt

Sie alle wissen, dass dies $this->userModel das Objekt der Klasse im Modell ist. Gehen Sie also einfach direkt zur Modelldatei und werfen Sie einen Blick darauf.

Tatsächlich spielt es keine Rolle, ob Sie diese Datei lesen oder nicht. Bei unseren benutzerdefinierten Modelldateien handelt es sich um geerbte Modelldateien. Dabei handelt es sich um die Dateien, die Kaka Ihnen am Anfang dieses Artikels gezeigt hat und die im Modell verwendet werden.

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Die grundlegende Beziehung zwischen Modellen

Kommen Sie dann zur Modellklasse am unteren Rand des Frameworksthinkphp/library/think/Model.php. thinkphp/library/think/Model.php

看到这个方法是不是应该明白一点点东西,就是不去看文档也应该一下明白,当save方法只有一个参数的时候就是新增,当存在第二个参数时就是更新。

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

由于咔咔的案例中给的参数就是一个数组,所以第一个判断就不会执行。

接下来将对这个save方法中的Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage进行深度解析。

接下来看一下这个方法都进行了什么操作。

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

根据上图可以得知传递过来的参数就是数组,也就是我们需要新增的数据。

在上图中最重要的一个步骤就是这行代码$this->setAttr($key, $value, $data);

Sie sollten ein wenig verstehen, nachdem Sie diese Methode gesehen haben. Auch wenn Sie die Dokumentation nicht lesen, sollten Sie sie sofort verstehen. Wenn die Speichermethode nur einen Parameter hat, wird dieser hinzugefügt, und wenn es einen zweiten Parameter gibt , es wird aktualisiert.

Aktuelles Datenobjekt speichern🎜Speichern Sie das aktuelle Datenobjekt🎜🎜🎜Da der in Kakas Fall angegebene Parameter ein Array ist, wird das erste Urteil nicht ausgeführt. 🎜🎜 Als nächstes fügen wir in dieser Speichermethode Write Überprüfen Sie die Daten vorher für eine detaillierte Analyse. 🎜🎜Schauen wir uns an, was diese Methode bewirkt. 🎜🎜Daten vor dem Schreiben prüfen🎜Überprüfen Sie die Daten vor dem Schreiben🎜🎜🎜Gemäß der obigen Abbildung können wir erkennen, dass es sich bei dem übergebenen Parameter um ein Array handelt, bei dem es sich um die Daten handelt, die wir hinzufügen müssen. 🎜🎜Der wichtigste Schritt im obigen Bild ist diese Codezeile$this->setAttr($key, $value, $data);🎜🎜Den Eingabeaufforderungen zufolge bin ich zu dieser Methode gekommen. Die Werte der drei Parameter wurden ebenfalls gedruckt Daher wird die Beurteilung nicht ausgeführt. Die Ausführung erfolgt nur im letzten Schritt, dem Festlegen der Datenobjekteigenschaften. 🎜
修改器 设置数据对象值
Der Modifikator legt den Datenobjektwert fest

Gemäß dem obigen Bild wird das endgültige Rückgabeergebnis direkt an $this->checkBeforeSave($data, $where), das ist das Bild unten. $this->checkBeforeSave($data, $where),也就是下图。

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

接下来关于$result = $this->exists ? $this->updateData($where) : $this->insertData($sequence);这行代码就需要该好好理解一下了。

首先可以看到第一个属性那就是$this->exists,这个值熟悉不,没错,就是在Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage时如果存在where条件则会设置为true,请看下图

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

所以说代码会执行$this->insertData($sequence)

Daten vor dem Schreiben prüfen

Überprüfen Sie die Daten vor dem Schreiben -Radius: 4px; Hintergrundfarbe: rgba(27,31,35,.05); : rgb(271, 93, 108);">$result = $this->exists ? $this->updateData($where) : $this->insertData($sequence);Diese Zeile Der Code muss sorgfältig verstanden werden.

🎜Zuerst können Sie das erste Attribut sehen, das ist: $ this ->existiert, kennen Sie diesen Wert? Ja, wenn Sie die Daten vor dem Schreiben überprüfen, wird er auf „true“ gesetzt, wenn eine Where-Bedingung vorliegt. Bitte sehen Sie sich das Bild unten an. https:/ /img-blog.csdnimg.cn/20201120121944964.png" alt="Daten vor dem Schreiben prüfen" style="border-radius: 6px; display: block; margin: 20px auto; object -fit : include;"/>🎜Überprüfen Sie die Daten vor dem Schreiben🎜🎜🎜Der Code wird also ausgeführt$this->insertData($sequence)Bei dieser Methode achten wir auf nichts, der Schwerpunkt liegt auf dem Hinzufügen von Daten. 🎜🎜Achten Sie einfach auf den Ort, den Kaka umkreist. 🎜
Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Neue geschriebene Daten hinzufügen

Dann kommt der Code zur Einfügemethode. In dieser Methode$this->parseOptions();Hier ist das zuvor analysierte Analyseausdruck (kann für Abfrage- oder Schreibvorgänge verwendet werden) Inhalt. $this->parseOptions();这里就是之前分析的分析表达式(可用于查询或者写入操作)这块内容。

在这里就使用了连接器,这个连接器就是在本类的构造函数通过依赖注入的方式注入进来的对象。

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

然后就会来到thinkphp/library/think/db/Connection.php这个文件的insert方法。

接着会调用execute方法进行执行SQL语句,因为在这之前已经将sql语句生成好了,在下文将重新起一个小节深度解析这个方法。

通过builder

Hier wird ein Connector verwendet. Dieser Connector ist ein Objekt, das durch Abhängigkeitsinjektion in den Konstruktor dieser Klasse eingefügt wird. 🎜🎜Datensatz einfügen 🎜Fügen Sie den Datensatz ein🎜🎜🎜 und Sie gelangen zu thinkphp/library/think/db/Connection.phpinsert Methode. 🎜🎜Dann wird <img src="https://img-blog.csdnimg.cn/20201120123414415.png" alt="Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage" style="max-width:90%"><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">Datensatz einfügen</figcaption><h1 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; border-top: 2px solid rgb(248, 57, 41); text-align: center; font-size: 1.3em;"> <span class="prefix" style="display: none;"></span><span class="content" style="display: inline-block; font-weight: normal; background: rgb(248, 57, 41); color: #ffffff; padding: 3px 10px 1px; border-radius: 0 0 13px 13px;">3. Eingehende Analyse der Ausführung von Ausführung</span><span class="suffix"></span> </h1> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Der Fall ist immer noch der im vorherigen Abschnitt verwendete Fall</p> <figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img-blog.csdnimg.cn/20201120154853356.png" alt="Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage" style="max-width:90%"><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">Falldemonstration</figcaption></figure><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Zuerst , es ist notwendig, es klarzustellen<code style="font -size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27 ,31,35,.05); Schriftfamilie: Operator Mono, Consolas, Monaco, Monospace; Farbe: rgb(271, 93, 108);">execute Die Parameter dieser Methode Es gibt drei Parameter in dieser Methode, hauptsächlich Beschreiben Sie den ersten und den zweiten Parameter. execute这个方法的参数,在这个方法存在三个参数,主要说明第一和第二个参数。

参数的值咔咔已经放到了代码注释中。

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

然后一步一步的分析,首先执行的是$this->initConnect(true);Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage。

在这个方法中需要知道的是,这里到底判断的是什么,其实也就是deploy

Der Wert des Parameters wurde in den Codekommentar eingefügt.
Eingehende Analyse des Modells der ThinkPHP-DatenbankabfrageExplizite Parameter
Parameter löschen

Analysieren Sie dann Schritt für Schritt, die erste Ausführung ist $this->initConnect(true);Initialisieren Sie die Datenbankverbindung.

🎜Was Sie bei dieser Methode wissen müssen, ist, was hier beurteilt wird, nämlich deployWas ist dieser Parameter? 🎜🎜🎜🎜Initialisierung der Datenbankverbindung🎜🎜🎜Zunächst muss klar sein, dass dieser Parameter aus der Konfigurationsdatei abgerufen werden muss, und dann analysieren wir jetzt die Datenbank, sodass dieser Parameter sehr wahrscheinlich ist in der Datenbankkonfigurationsdatei. 🎜

Nach der Analyse des Codes haben wir dieses Konfigurationselement in der Datenbankkonfigurationsdatei gefunden. Dieses Konfigurationselement ist die Bereitstellungsmethode der Datenbank.

0 Zentralisiert (Einzelserver), 1 Verteilt (Master-Slave-Server) In diesem Fall oder im realen Projektbetrieb werden verteilte Datenbanken im Framework nicht verwendet, daher besteht keine Notwendigkeit, dies zu verstehen.

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Datenbankkonfigurationsdatei

Dann wird der Code weiter ausgeführt$this->linkID = $this->connect();, d. h. der Kommentar gibt einen Hinweis auf die Standard-Einzeldatenbank. $this->linkID = $this->connect();,也就是注释给的提示为默认单数据库。

来到这个方法中,咔咔截图截到的地方会进行数据库连接ID 支持多个连接的判断。

然后第二个判断会直接获取参数配置信息和本类的构造函数中提前获取的到的Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage,并且最后返回给config属性。

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

接下来解析Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage这块的内容,这块的内容,判断配置信息中的params索引值,这个值在配置文件是一个空数组,所以是返回true的。

第二个判断是否为数组同样也会返回true。

所以说这个判断条件成立,会执行if的判断语句。

在这里说一个小的知识点就是关于运算符与或非

Bei dieser Methode wird anhand der Datenbankverbindungs-ID beurteilt, ob der Ort, an dem der Kaka-Screenshot aufgenommen wurde, mehrere Verbindungen unterstützt.

Dann ruft das zweite Urteil direkt die Parameterkonfigurationsinformationen und die Datenbankkonfigurationsdatei ab, die zuvor im Konstruktor dieser Klasse abgerufen wurden, und gibt sie schließlich an das Konfigurationsattribut zurück.

Mit Datenbankmethode verbinden🎜Mit Datenbank-Methode verbinden🎜🎜🎜 Als nächstes analysieren Sie den Inhalt der Verbindungsparameter. Der Inhalt dieses Blocks wird verwendet, um den Parameterindexwert in den Konfigurationsinformationen zu bestimmen . Dieser Wert befindet sich in der Konfigurationsdatei. Da es sich um ein leeres Array handelt, wird „true“ zurückgegeben. 🎜🎜Die zweite Beurteilung, ob es sich um ein Array handelt, wird ebenfalls true zurückgeben. 🎜🎜Wenn diese Beurteilungsbedingung erfüllt ist, wird die if-Beurteilungsanweisung ausgeführt. 🎜🎜Ein kleiner Wissenspunkt hier betrifft den OperatorWissen über UND oder NICHT. 🎜🎜Und: true zurückgeben, wenn alle Bedingungen wahr sind🎜🎜 oder: true zurückgeben, solange eine Bedingung wahr ist🎜
Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Verbindungsparameter

Diese Art von Attribut im obigen Bildparams wurde im Voraus deklariert. Hier benötigen wir nur die Parameter, die erforderlich sind, wenn pdo eine Verbindung zu MySQL herstellt. params已经提前声明好了,这里只需要这是pdo连接mysql时需要的参数即可。

PDOEingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
PDOEingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

为了方便大家理解咔咔将这个参数给大家打印了出来,请看下图。

PDOEingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
PDOEingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

也就说关于pdo参数其实就是声明的一系列常量而已。

接下来就是重中之重了,也就是使用pdo的方式进行连接数据库,并且将连接信息返回回去,也就是返回给$this->linkID,直到这里Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage就结束了。

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

然后就会使用PDo的操作实例执行execute

Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

Eingehende Analyse des Modells der ThinkPHP-DatenbankabfrageUm Ihnen das Verständnis zu erleichtern, hat Kaka diesen Parameter für alle ausgedruckt, siehe Bild unten. Eingehende Analyse des Modells der ThinkPHP-DatenbankabfrageEingehende Analyse des Modells der ThinkPHP-Datenbankabfrage

Mit anderen Worten, die PDO-Parameter sind eigentlich nur eine Reihe deklarierter Konstanten. 🎜🎜Der nächste Schritt besteht darin, mit pdo eine Verbindung zur Datenbank herzustellen und die Verbindungsinformationen an $this->linkID, bis die Datenbankverbindung hier initialisiert wird, endet sie. 🎜🎜Verwenden Sie pdo, um eine Verbindung zur Datenbank herzustellen 🎜Verwenden Sie pdo, um eine Verbindung zur Datenbank herzustellen🎜🎜🎜Dann wird es mit der PDo-Operationsinstanz ausgeführtexecuteDiese Methode ist eine integrierte Methode, die letztendlich die Anzahl der Datensätze zurückgibt oder beeinflusst. 🎜🎜🎜🎜🎜 4. Zusammenfassung 🎜🎜🎜🎜🎜Dieser Abschnitt beginnt mit dem Verständnis der für das Modell erforderlichen Dateien und führt dann beim Hinzufügen des Modells eine detaillierte Quellcodeanalyse durch. 🎜

Beim Parsen des Quellcodes wurden einige Teile nicht vollständig erklärt, aber die wichtigsten Teile wurden durchgegangen.

Endlich execute diese Methode eingehend analysieren. Warum sollten wir diese Methode analysieren, weil diese Methode der letzte Schritt bei der Ausführung aller Operationen ist?

Beharrlichkeit beim Lernen, Beharrlichkeit beim Bloggen und Beharrlichkeit beim Teilen sind die Überzeugungen, die Kaka seit seiner Karriere vertritt. Ich hoffe, dass Kakas Artikel im riesigen Internet Ihnen ein wenig helfen können Kaka, wir sehen uns in der nächsten Ausgabe.

Das obige ist der detaillierte Inhalt vonEingehende Analyse des Modells der ThinkPHP-Datenbankabfrage. 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