Heim  >  Artikel  >  PHP-Framework  >  ThinkPHP: Grundprinzipien der Datenabfrage

ThinkPHP: Grundprinzipien der Datenabfrage

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼nach vorne
2019-12-16 17:46:263019Durchsuche

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();

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();

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();

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();

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]);

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();

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();

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();

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();

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]);

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);
    }    
}

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();
    }
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:thinkphp.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen

In Verbindung stehende Artikel

Mehr sehen