ThinkPHP: Grundprinzipien der Datenabfrage

爱喝马黛茶的安东尼
Freigeben: 2019-12-16 17:46:26
nach vorne
3057 Leute haben es durchsucht

ThinkPHP: Grundprinzipien der Datenabfrage

Bitte versuchen Sie, die verschiedenen Grundprinzipien der Datenabfrage, die in diesem Artikel beschrieben werden, in Ihre Projektspezifikationen zu integrieren. Dies ist auch die vom Beamten empfohlene Best Practice. Vorher hoffe ich, dass Sie einen früheren Blog gelesen haben: „Verstehen Sie wirklich die korrekte Verwendungshaltung von DB-Klassen und -Modellen?“.

Versuchen Sie, keine Array-bedingten Abfragen zu verwenden

Der größte Teil der verwirrenden Abfragesyntax wird durch die Verwendung von Array-Abfragen verursacht, und die Verwendung von Array-bedingten Abfragen in 5.1 ist es auch das gleiche wie in 5.0 Es ist völlig anders. Wenn Sie an die Array-Abfragemethode von 5.0 gewöhnt sind, empfehle ich Ihnen, diesen Artikel zu lesen: „Lernen Sie, wie Sie die 5.1-Array-Objektabfrage verwenden“.

Das Folgende könnte ein Abfragefehler sein, den viele Anfänger machen.

$where['id'] = ['in', '1,2,3'];
User::where($where)->select();
Nach dem Login kopieren

Offensichtlich ist dieses Abfragedenken stark von der alten Version beeinflusst. Im Vergleich zu 5.0 ist die Abfragesyntax von Version 5.1 objektorientierter. Das Folgende ist die korrekte Verwendung.

$where['id'] = [1,2,3];
User::where($where)->select();
Nach dem Login kopieren

Vielleicht weil die Arrays von PHP so einfach zu verwenden sind, mögen viele Leute Array-Abfragebedingungen (oder haben sie Angst vor Objekten?). Wenn Sie den Abfrage-Generator jedoch richtig verwenden und mit den zugehörigen Funktionen des Modells zusammenarbeiten, kann Ihre Abfragelogik klarer und einfacher zu warten sein.

Darüber hinaus können Sie unter einigen komplexeren Abfragebedingungen kein Array zum Vervollständigen der Abfrage verwenden, z. B. bei der folgenden Abfrageverwendung.

User::where('id', '>', 100)
    ->whereOr(&#39;id&#39;, &#39;<&#39;, 10)
    ->where(&#39;name&#39;, &#39;like&#39;, &#39;think%&#39;)
    ->whereColumn(&#39;name&#39;, &#39;nickname&#39;)
    ->when(&#39;80&#39;== $condition, function ($query) {
        $query->where(&#39;score&#39;, &#39;>&#39;, 80)->limit(10);
    })->select();
Nach dem Login kopieren

Wenn Sie also nicht mit der Verwendung der Array-Abfrage in 5.1 vertraut sind, versuchen Sie bitte, die Array-Bedingungsabfrage nicht zu verwenden.

String-Abfragebedingungen sicher verwenden

Wenn Sie String-Abfragebedingungen verwenden und externe Variablen vorhanden sind, achten Sie darauf, Parameterbindung zu verwenden, und verwenden Sie vorzugsweise die Methode whereRaw, da dies möglich ist mit anderen Abfrage-Builder-Methoden gemischt werden.

User::whereRaw("id = :id AND name = :name", [
        &#39;id&#39; => [$id, \PDO::PARAM_INT] , 
        &#39;name&#39; => $name
    ])->where(&#39;status&#39;, 1)
    ->order(&#39;id&#39;, &#39;desc&#39;)
    ->select();
Nach dem Login kopieren

Bei einigen Abfragen, bei denen es mehr um die Leistung geht, können Sie die Abfrage- oder Ausführungsmethode auch direkt verwenden. Sie sollten jedoch auch auf die Sicherheit der Parameter achten und die Transplantationsprobleme verschiedener Datenbanken berücksichtigen.

Db::query("select * from think_user where id=? AND status=?", [8, 1]);
Db::execute("update think_user set name=:name where status=:status", [&#39;name&#39; => &#39;thinkphp&#39;, &#39;status&#39; => 1]);
Nach dem Login kopieren

Verwenden Sie den Raw-Mechanismus für Abfragen, die SQL-Funktionen verwenden

Wenn Ihre Abfrage SQL-Funktionen enthält, verwenden Sie bitte die Methode whereRaw (oder whereExp), orderRaw oder fieldRaw.

User::whereExp(&#39;nickname&#39;, "= CONCAT(name, &#39;-&#39;, id)")
    ->orderRaw("field(name,&#39;thinkphp&#39;, &#39;kancloud&#39;)")
    ->fieldRaw(&#39;id,SUM(score)&#39;)
    ->select();
Nach dem Login kopieren

Verschlüsse angemessen verwenden, aber nicht missbrauchen

Abschlussabfragen haben in Abfragekonstruktoren einige besondere Verwendungsmöglichkeiten, es besteht jedoch keine Notwendigkeit, sie zu missbrauchen, es sei denn, dies ist erforderlich.

Zu den typischen Nutzungsszenarien von Abschlussabfragen gehören die folgenden.

Abschlüsse werden normalerweise in bedingten Abfragen verwendet, um eine Reihe von bedingten Abfragen darzustellen.

User::when($condition, function ($query) {
    // 满足条件后执行
    $query->where(&#39;score&#39;, &#39;>&#39;, 80)->limit(10);
}, function ($query) {
    // 不满足条件执行
    $query->where(&#39;score&#39;, &#39;>&#39;, 60);
})->select();
Nach dem Login kopieren

Abschlüsse werden häufig in einigen Unterabfragen verwendet.

User::whereIn(&#39;id&#39;, function ($query) {
    $query->table(&#39;profile&#39;)
        ->where(&#39;name&#39;, &#39;like&#39;, &#39;think%&#39;)
        ->field(&#39;id&#39;);
})->select();
Nach dem Login kopieren

Generieren Sie einen Satz geschlossener Abfragebedingungen

User::where(&#39;id&#39;, &#39;>&#39;, 100)
    ->whereOr(function($query) {
        $query->where(&#39;name&#39;, &#39;like&#39;, &#39;think%&#39;)
        ->whereColumn(&#39;name&#39;, &#39;nickname&#39;);
    })->select();
Nach dem Login kopieren

Bei dieser Abfrageverwendung werden die Abfragebedingungen im Abschluss mit Klammern auf beiden Seiten hinzugefügt, um eine geschlossene Abfragebedingung zu erhalten.

In vielen verwandten Preload-Abfragen können Abschlüsse verwendet werden, um verwandte Daten zu filtern.

User::with([&#39;profile&#39; => function($query) {
$query->field(&#39;user_id,email,phone&#39;);
}])->select([1,2,3]);
Nach dem Login kopieren

Verwenden Sie Ihre Abfragebedingungen so weit wie möglich wieder

Alle Abfragebedingungen sollten an einem Ort definiert und an mehreren Orten wiederverwendet werden, z. B. durch Kapselung in Modellmethoden, Schreiben Sie insbesondere nicht viele komplexe Abfragebedingungen direkt in Ihren Controller-Code. Andernfalls wird es für die Suchcodes der Welt, sobald das Unternehmen angepasst ist, ein Albtraum, Ihre Abfragebedingungen zu ändern.

Im offiziellen Handbuch oder in einigen Tutorials finden Sie möglicherweise viele Möglichkeiten, Abfragebedingungen direkt im Controller zu kapseln. Dies dient jedoch nur der einfacheren Darstellung der Verwendung und ist nicht ratsam.

In einigen mittelgroßen und großen Anwendungsarchitekturdesigns ist das Modell normalerweise in Datenschicht, Logikschicht und Serviceschicht unterteilt, und der Controller ruft nur Methoden der Serviceschicht auf. Die Abfragelogik ist grundsätzlich in der Logikschicht gekapselt, und die Datenschicht erstellt lediglich verschiedene Definitionen des Modells.

In einfachen Anwendungen kann der Trait-Mechanismus von PHP auch zur Implementierung des Code-Wiederverwendungsmechanismus verwendet werden.

Verwenden Sie den Abfragebereich oder den Sucher, um die Abfrage zu vereinfachen.

Wenn Sie eine Modellabfrage verwenden, versuchen Sie, Ihre Abfragebedingungen in den Abfragebereich oder die Suchmethode zu kapseln. Abfrage Der Hauptunterschied zwischen Ein Bereich und ein Sucher bedeuten, dass der Abfragebereich besser zum Definieren einer Reihe von Abfragebedingungen (mehrere Felder) geeignet ist. Wenn Sie mehrere Abfragebereiche aufrufen möchten, müssen Sie sie mehrmals aufrufen, während der Sucher besser zum Definieren von a geeignet ist Feldabfrage (tatsächlich handelt es sich nicht um absolute) Bedingungen, Sie müssen die withSearch-Methode nur einmal aufrufen.

Beispiele für die Verwendung von Abfragebereichen und Suchfunktionen.

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    public function scopeVip($query)
    {
        $query->where(&#39;user_type&#39;, &#39;vip&#39;)
            ->where(&#39;status&#39;, 1)
            ->field(&#39;id,name&#39;);
    }
    
    public function searchAgeAttr($query, $age)
    {
        $query->where(&#39;age&#39;,&#39;>&#39;,$age);
    }    
    
    public function searchScoreAttr($query, $score)
    {
        $query->where(&#39;score&#39;,&#39;<=&#39;,$score)->where(&#39;score&#39;, &#39;>&#39; ,0);
    }    
}
Nach dem Login kopieren

Controller-Code

<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
class index extends Controller
{
    public function index(Request $request)
    {
        // 查询VIP会员
        User::vip()->select();
        // 查询年龄和分数
        User::withSearch([&#39;age,&#39;score&#39;&#39;], $request->param())->select();
    }
}
Nach dem Login kopieren

Im Controller-Code konzentrieren wir uns nur auf die Geschäftslogik selbst und müssen nicht auf die Abfragebedingungen innerhalb dieser Logik achten. Ausführlichere Informationen zu Suchern und Abfragebereichen finden Sie im offiziellen Handbuch.

Die chinesische PHP-Website bietet eine große Anzahl kostenloser ThinkPHP-Einführungs-Tutorials, zum Lernen ist jeder herzlich willkommen!

Dieser Artikel wurde reproduziert von: https://blog.thinkphp.cn/833794

Das obige ist der detaillierte Inhalt vonThinkPHP: Grundprinzipien der Datenabfrage. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:thinkphp.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage