Heim >PHP-Framework >Denken Sie an PHP >Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
"Wir haben oben über die ThinkPHPDatenbankabfrage-DB-Methode gesprochen. Heute werden wir kurz über die Implementierung der Model-Klasse sprechen.
"
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.
Das Modellverzeichnis muss im Modulverzeichnis vorhanden sein
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.
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
Nach einem kurzen Verständnis müssen wir einen Fall im Modell analysieren, nur für die Implementierung eines Falles!
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.
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.
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.
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.
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.
Kommen Sie dann zur Modellklasse am unteren Rand des Frameworksthinkphp/library/think/Model.php
. thinkphp/library/think/Model.php
。
看到这个方法是不是应该明白一点点东西,就是不去看文档也应该一下明白,当save方法只有一个参数的时候就是新增,当存在第二个参数时就是更新。
由于咔咔的案例中给的参数就是一个数组,所以第一个判断就不会执行。
接下来将对这个save方法中的Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage
进行深度解析。
接下来看一下这个方法都进行了什么操作。
根据上图可以得知传递过来的参数就是数组,也就是我们需要新增的数据。
在上图中最重要的一个步骤就是这行代码$this->setAttr($key, $value, $data);
Write Überprüfen Sie die Daten vorher
für eine detaillierte Analyse. 🎜🎜Schauen wir uns an, was diese Methode bewirkt. 🎜🎜🎜Ü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. 🎜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)
,也就是下图。
接下来关于$result = $this->exists ? $this->updateData($where) : $this->insertData($sequence);
这行代码就需要该好好理解一下了。
首先可以看到第一个属性那就是$this->exists
,这个值熟悉不,没错,就是在Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage时如果存在where条件则会设置为true,请看下图
所以说代码会执行$this->insertData($sequence)
Ü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. 🎜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();
这里就是之前分析的分析表达式(可用于查询或者写入操作)
这块内容。
在这里就使用了连接器,这个连接器就是在本类的构造函数通过依赖注入的方式注入进来的对象。
然后就会来到thinkphp/library/think/db/Connection.php
这个文件的insert
方法。
接着会调用execute
方法进行执行SQL语句,因为在这之前已经将sql语句生成好了,在下文将重新起一个小节深度解析这个方法。
通过builder
thinkphp/library/think/db/Connection.php
insert
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
这个方法的参数,在这个方法存在三个参数,主要说明第一和第二个参数。
参数的值咔咔已经放到了代码注释中。
然后一步一步的分析,首先执行的是$this->initConnect(true);
Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage。
在这个方法中需要知道的是,这里到底判断的是什么,其实也就是deploy
Analysieren Sie dann Schritt für Schritt, die erste Ausführung ist $this->initConnect(true);
Initialisieren Sie die Datenbankverbindung.
deploy
Was 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.
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这块的内容,这块的内容,判断配置信息中的params索引值,这个值在配置文件是一个空数组,所以是返回true的。
第二个判断是否为数组同样也会返回true。
所以说这个判断条件成立,会执行if的判断语句。
在这里说一个小的知识点就是关于运算符与或非
Wissen über UND oder NICHT
. 🎜🎜Und: true zurückgeben, wenn alle Bedingungen wahr sind🎜🎜 oder: true zurückgeben, solange eine Bedingung wahr ist🎜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时需要的参数即可。
为了方便大家理解咔咔将这个参数给大家打印了出来,请看下图。
也就说关于pdo参数其实就是声明的一系列常量而已。
接下来就是重中之重了,也就是使用pdo的方式进行连接数据库,并且将连接信息返回回去,也就是返回给$this->linkID
,直到这里Eingehende Analyse des Modells der ThinkPHP-Datenbankabfrage就结束了。
然后就会使用PDo的操作实例执行execute
$this->linkID
, bis die Datenbankverbindung hier initialisiert wird, endet sie. 🎜🎜 🎜Verwenden Sie pdo, um eine Verbindung zur Datenbank herzustellen🎜🎜🎜Dann wird es mit der PDo-Operationsinstanz ausgeführtexecute
Diese 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!