Im vorherigen Artikel haben wir die grundlegende Daten-CURD-Methode beherrscht, aber in mehr Fällen sind CURD-Operationen aufgrund von Unterschieden in der Geschäftslogik oft nicht so einfach, insbesondere bei komplexer Geschäftslogik, was auch ein Manko von ActiveRecord ist Modus. Die Abfragesprache von ThinkPHP kann in Kombination mit kohärenten Operationen komplexe Anforderungen an die Geschäftslogik gut lösen. In diesem Artikel werden wir uns zunächst eingehend mit der Abfragesprache des Frameworks befassen.
Einführung
ThinkPHP verfügt über integrierte, sehr flexible Abfragemethoden, mit denen Datenabfragevorgänge schnell ausgeführt werden können. Abfragebedingungen können für Vorgänge wie Lesen, Aktualisieren und Löschen verwendet werden, die hauptsächlich das Wo betreffen Methode usw. Unabhängig davon, welche Datenbank Sie verwenden, verwenden Sie fast dieselbe Abfragemethode (einige Datenbanken wie Mongo haben unterschiedliche Ausdrucksabfragen. Das System hilft Ihnen, die Unterschiede zwischen verschiedenen Datenbanken zu lösen.) Framework Diese Abfragemethode wird als Abfragesprache bezeichnet. Die Abfragesprache ist auch das ORM-Highlight des ThinkPHP-Frameworks und macht Abfragevorgänge einfacher und verständlicher. Lassen Sie uns nacheinander die Konnotation der Abfragesprache erklären.
Abfragemethode
ThinkPHP kann die direkte Verwendung von Zeichenfolgen als Abfragebedingungen unterstützen, in den meisten Fällen wird jedoch empfohlen, Indexarrays oder Objekte als Abfragebedingungen zu verwenden, da dies sicherer ist. 1. Verwenden Sie Zeichenfolgen als Abfragebedingungen. Dies ist die traditionellste Methode, die jedoch nicht sehr sicher ist. Beispiel:
$User = M("User"); 🎜 >$User->where('type=1 AND status=1')->select();
Die endgültig generierte SQL-Anweisung ist
SELECT * FROM think_user WHERE type = 1 AND status=1
Bei Verwendung einer Zeichenfolgenabfrage können wir den von der neuen Version bereitgestellten Sicherheitsvorverarbeitungsmechanismus für Zeichenfolgenbedingungen verwenden, der vorerst nicht im Detail erläutert wird. 2. Die Verwendung von Arrays als Abfragebedingungen ist die am häufigsten verwendete Abfragemethode, zum Beispiel:
$User = M("User" // Instanziieren Sie das Benutzerobjekt
$condition[ '); name'] = 'thinkphp';
$condition['status'] = 1;
// Übergeben Sie die Abfragebedingungen an die Abfragemethode
$User-> ;where($condition)->select();
Die endgültige generierte SQL-Anweisung ist
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
Wenn Sie eine Abfrage mit mehreren Feldern durchführen, ist die standardmäßige logische Beziehung zwischen Feldern ein logisches UND. Sie können die standardmäßige logische Beurteilung jedoch mithilfe der folgenden Regeln ändern, indem Sie _logic verwenden, um die Abfragelogik zu definieren:
$User = M("User"); // Benutzerobjekt instanziieren
$condition['name'] = 'thinkphp';
$condition['account'] = 'thinkphp' ;
$condition['_logic'] = 'OR';
// Übergeben Sie die Abfragebedingungen an die Abfragemethode
$User->where($condition )- >select();
Die endgültige generierte SQL-Anweisung ist
SELECT * FROM think_user WHERE `name`='thinkphp' OR `account`='thinkphp'
3. Verwenden Sie die Objektmethode zum Abfragen. Nehmen Sie hier das integrierte stdClass-Objekt als Beispiel:
$User = M("User"); // Instanziieren Sie das Benutzerobjekt
// Abfragebedingungen definieren
$condition = new stdClass();
$condition->name = 'thinkphp'; 1;
$User->where($condition)->select();
Die endgültige generierte SQL-Anweisung ist die gleiche wie oben
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
Die Wirkung der Verwendung von Objektmodus-Abfragen und der Verwendung von Array-Abfragen ist gleich und austauschbar. In den meisten Fällen empfehlen wir die Verwendung des Array-Modus, um effizienter zu sein .
Ausdrucksabfrage
Die obige Abfragebedingung ist nur eine einfache Gleichheitsbeurteilung. Abfrageausdrücke können verwendet werden, um mehr SQL-Abfragesyntax zu unterstützen, die auch die ThinkPHP-Abfragesprache ist Das Wesentliche des Abfrageausdrucks ist das Verwendungsformat: $map['Feldname'] = array('Ausdruck','Abfragebedingung'); Die unterstützten Abfrageausdrücke lauten wie folgt. Die Bedeutung ist:
Ausdruck
Bedeutung
EQ Gleich (=)
NEQ Nicht gleich (<>)
GT größer als (>)
EGT größer oder gleich (>=)
LT kleiner als (< )
ELT Kleiner oder gleich (<=)
LIKE Fuzzy-Abfrage
[NOT] BETWEEN (nicht) Intervallabfrage
[NOT] IN (nicht ) IN-Abfrage
EXP Ausdrucksabfrage, unterstützt SQL-Syntax
Beispiele sind wie folgt: EQ: gleich (=)
Zum Beispiel:
$map[' id'] = array( 'eq',100);
entspricht der folgenden Abfrage
$map['id'] = 100; Die durch
ist id = 100NEQ: Ungleich (<>)Zum Beispiel:
Die Abfrage Bedingung dargestellt durch
ist id < 100GT: größer als (>)
$map['id'] = array('gt',100); Die durch
dargestellte Abfragebedingung ist id > ; 100EGT: größer oder gleich (>=)
Zum Beispiel:
$map['id'] = array('egt ',100); Die durch
dargestellte Abfragebedingung ist id >= 100LT: kleiner als (<)
Zum Beispiel:
$map['id'] = array ('lt',100); Die durch
dargestellte Abfragebedingung ist id <100ELT: Kleiner als oder gleich (<=)
Zum Beispiel:
$map[ 'id'] = array('elt',100);
repräsentiert die Abfragebedingungs-ID <= 100[NOT] LIKE: Gleich wie SQL LIKE
Zum Beispiel:
$map['name'] = array('like','thinkphp%');
Die Abfragebedingung wird zu einem Namen wie „thinkphp%“
Wenn der Parameter DB_LIKE_FIELDS konfiguriert ist, werden einige Felder automatisch angezeigt Führen Sie eine Fuzzy-Abfrage durch. Wenn Sie beispielsweise Folgendes festlegen:
'DB_LIKE_FIELDS'=>'title|content'
, verwenden Sie
$map['title'] = 'thinkphp';
Die Abfragebedingung erhält einen Titel wie „%thinkphp%“
Unterstützt beispielsweise den Array-Modus
$map['a'] =array('like',array(' %thinkphp %','%tp'),'OR');
$map['b'] =array('notlike',array('%thinkphp%','%tp'), 'AND ');
Die generierten Abfragebedingungen sind:
(a wie '%thinkphp%' ODER a wie '%tp') UND (b nicht wie '%thinkphp%' UND b nicht wie '%tp')
[NOT] BETWEEN: Wie SQLs [not] between unterstützen Abfragebedingungen Zeichenfolgen oder Arrays, zum Beispiel:
$map['id'] = array('between','1,8');
ist äquivalent zu Folgendem:
$map['id'] = array('between',array('1 ', '8'));
Die Abfragebedingung wird zur ID ZWISCHEN 1 UND 8[NOT] IN: Wie SQLs [not] in unterstützt die Abfragebedingung Zeichenfolgen oder Arrays, zum Beispiel:
$map['id'] = array('not in','1,5,8');
entspricht dem Folgenden:
$map['id '] =array('not in',array('1','5','8'));
Die Abfragebedingung wird zu id NOT IN (1,5, 8)EXP: Ausdruck, Unterstützen Sie komplexere Abfragesituationen
Zum Beispiel:
$map['id'] = array('in','1,3,8');
kann geändert werden in :
$map['id'] = array('exp',' IN (1,3,8) ');
Die exp-Abfragebedingungen werden nicht als Zeichenfolgen behandelt, Daher können die nachfolgenden Abfragebedingungen jede von SQL unterstützte Syntax verwenden, einschließlich der Verwendung von Funktionen und Feldnamen. Abfrageausdrücke können nicht nur für Abfragebedingungen, sondern auch für Datenaktualisierungen verwendet werden, zum Beispiel:
$User = M("User"); // Benutzerobjekt instanziieren
// To Datenobjektattributzuweisung ändern
$data['name'] = 'ThinkPHP';
$data['score'] = array('exp','score+1'); // 1 zu den Punkten des Benutzers hinzufügen
$User->where('id=5')->save($data); // Die geänderten Daten gemäß den Bedingungen speichern
Schnellabfrage
Ab Version 3.0 wurde eine Schnellabfragemethode hinzugefügt, die das Schreiben von Abfragebedingungen weiter vereinfachen kann, zum Beispiel: 1. Implementieren Sie dieselben Abfragebedingungen für verschiedene Felder
$ User = M("User"); // Instanziieren Sie das Benutzerobjekt
$map['name|title'] = 'thinkphp';
/ / Übergeben Sie die Abfragebedingungen an die Abfragemethode
$User->where($map)->select();
Die Abfragebedingung wird zu
name= 'thinkphp' OR title = 'thinkphp '
2. Implementieren Sie verschiedene Abfragebedingungen für verschiedene Felder
$User = M("User"); // Instanziieren Sie das Benutzerobjekt
$map['status&title' ] =array('1','thinkphp','_multi'=>true);
// Übergeben Sie die Abfragebedingungen an die Abfragemethode
$User->where($ map)->select();
'_multi'=>true muss am Ende des Arrays hinzugefügt werden, um anzuzeigen, dass es derzeit mehrere Bedingungen erfüllt, sodass die Abfragebedingung zu
status= 1 AND title = 'thinkphp'
, Abfragefelder unterstützen mehr, zum Beispiel: $map['status&score&title'] =array('1',array('gt','0'),'thinkphp',' _multi'= >true);Die Abfragebedingung wird zu status= 1 UND Punktzahl >0 UND Titel = 'thinkphp'Hinweis: In der Verknüpfungsabfrage -Methode können „|“ und „&“ nicht gleichzeitig verwendet werden. IntervallabfrageThinkPHP unterstützt Intervallabfragen für ein bestimmtes Feld, zum Beispiel: $map['id'] = array(array( 'gt',1),array('lt',10)) ;Die erhaltene Abfragebedingung lautet: (`id` > 1) AND (`id` < 10)$map['id'] = array(array('gt',3),array('lt',10), 'or') ;Die erhaltene Abfrage Die Bedingung ist: (`id` > 3) OR (`id` < 10)$map['id'] = array(array('neq',6),array('gt ' ,3),'and'); Die erhaltene Abfragebedingung ist: (`id` != 6) AND (`id` > 3)Die letzte Bedingung kann AND, OR sein oder XOR-Operator, wenn nicht geschrieben, wird standardmäßig die UND-Verknüpfung verwendet.
Die Bedingungen der Intervallabfrage können alle Ausdrücke gewöhnlicher Abfragen unterstützen, was bedeutet, dass Ausdrücke wie LIKE, GT und EXP unterstützt werden können. Darüber hinaus kann die Intervallabfrage auch weitere Bedingungen unterstützen, sofern die Bedingungen für ein Feld zusammengeschrieben werden können, zum Beispiel:
Array-Bedingungen können auch mit String-Bedingungen gemischt werden, zum Beispiel:
Zum Beispiel:
Viele Abfragemethoden können ineinander konvertiert werden. Beispielsweise können die oben genannten Abfragebedingungen wie folgt geändert werden:
In Anwendungen verwenden wir häufig einige statistische Daten, wie z. B. die aktuelle Anzahl der Benutzer (oder diejenigen, die bestimmte Bedingungen erfüllen), die maximale Punktzahl aller Benutzer, die durchschnittliche Punktzahl der Benutzer usw. ThinkPHP bietet hierfür eine Methode Statistische Operationen. Eine Reihe integrierter Methoden, darunter:
Methode
Beschreibung
Anzahl zählt die Menge, die Parameter ist der Name des zu zählenden Feldes (Optional)
Max Holen Sie sich den Maximalwert, der Parameter ist der zu zählende Feldname (erforderlich)
Min Holen Sie sich den Minimalwert Parameter ist der zu zählende Feldname (erforderlich)
Avg Ruft den Durchschnittswert ab, der Parameter ist der zu zählende Feldname (erforderlich)
Sum Ruft die Gesamtpunktzahl ab, der Parameter ist der zu zählende Feldname (erforderlich)
Verwendungsbeispiel:
$User = M("User"); // Instanziieren Sie das Benutzerobjekt
Holen Sie sich die Anzahl von Benutzer:
$userCount = $User->count();
Oder basierend auf Feldstatistiken:
$userCount = $User->count("id ");
Erhalten Sie die maximale Punktzahl des Benutzers:
$maxScore = $User->max('score');
Erhalten Sie die Mindestpunktzahl der Benutzer, deren Bewertungen sind größer als 0:
$minScore = $User->where('score>0') ->min('score');
Ermitteln Sie die durchschnittliche Punktzahl des Benutzers:
$avgScore = $User->avg('score');
Statistics Die Gesamtpunktzahl des Benutzers:
$sumScore = $User->sum('score ');
Und alle statistischen Abfragen unterstützen die Verwendung kohärenter Operationen.
SQL-Abfrage
Der integrierte ORM- und ActiveRecord-Modus von ThinkPHP ermöglicht bequeme Datenzugriffsvorgänge, und die in der neuen Version hinzugefügte kohärente Betriebsfunktion macht diesen Datenvorgang komfortabler Klar, aber ThinkPHP behält weiterhin die Unterstützung für native SQL-Abfragen und Ausführungsvorgänge bei. Um den Anforderungen komplexer Abfragen und einiger spezieller Datenoperationen gerecht zu werden, ist der Rückgabewert der SQL-Abfrage das Abfrageergebnis der Db-Klasse, das direkt ohne Verarbeitung zurückgegeben wird. . Es umfasst hauptsächlich die folgenden zwei Methoden:
1. Abfragemethode
Abfrage führt SQL-Abfrageoperationen aus
Verwendungsabfrage( $ sql,$parse=false)
Parameter sql (erforderlich): die abzufragende SQL-Anweisung
parse (optional): ob die SQL analysiert werden muss
Rückgabewert
Wenn die Daten illegal sind oder die Abfrage falsch ist, geben Sie „false“ zurück
Andernfalls geben Sie den Datensatz mit den Abfrageergebnissen zurück (wie bei der Auswahlmethode)
Verwendungsbeispiel:
$Model = new Model() // Ein Modellobjekt instanziieren, das keiner Datentabelle entspricht
$Model->query( "select * from think_user where status=1");
Wenn Sie derzeit eine verteilte Datenbank verwenden und die Lese-/Schreibtrennung einrichten, wird die Abfragemethode immer auf dem Leseserver ausgeführt, sodass die Abfragemethode entspricht Lesevorgänge, unabhängig davon, was Ihre SQL-Anweisung ist. 2. Methode ausführen
execute wird zum Aktualisieren und Schreiben von SQL-Operationen von Daten verwendet
Verwendungexecute($sql,$parse=false)
Parameter sql (erforderlich): Auszuführende SQL-Anweisung
parse (optional): ob SQL analysiert werden muss
Rückgabewert Gibt „false“ zurück, wenn die Daten oder die Abfrage illegal sind falsch
Andernfalls wird die Anzahl der betroffenen Datensätze zurückgegeben
Verwendungsbeispiel:
$Model = new Model() // Ein Modellobjekt instanziieren, das keiner Datentabelle entspricht
$Model-> ;execute("update think_user set name='thinkPHP' where status=1");
Wenn Sie derzeit eine verteilte Datenbank verwenden und die Lese-/Schreibtrennung einrichten, wird die Ausführung ausgeführt Die Methode „execute“ wird immer auf dem schreibenden Server ausgeführt, sodass die Methode „execute“ Schreibvorgängen entspricht, unabhängig davon, was Ihre SQL-Anweisung ist.
Dynamische Abfrage
Mit Hilfe der Funktionen der PHP5-Sprache implementiert ThinkPHP dynamische Abfragemethoden. Die dynamischen Abfragemethoden des Kernmodells umfassen Folgendes:
Methodenname
Beschreibung
Beispiel
getBy Abfrage von Daten basierend auf dem Wert des Felds. Beispiel: getByName, getByEmail
getFieldBy Abfrage und Abfrage basierend auf dem Feld Geben Sie den Wert eines bestimmten Felds zurück. Zum Beispiel getFieldByName
1. getBy dynamische Abfrage Diese Abfragemethode fragt die Felder der Datentabelle ab. Beispielsweise verfügt das Benutzerobjekt über Attribute wie ID, Name, E-Mail, Adresse usw. Anschließend können wir die folgende Abfragemethode verwenden, um Datensätze direkt abzufragen, die die Bedingungen basierend auf einem bestimmten Attribut erfüllen.
$user = $User->getByName('liu21st');
$user = $User->getByEmail('liu21st@gmail.com');
$user = $User->getByAddress('Shenzhen, China');
Die dynamische Abfragemethode für mehrere Datenfelder wird derzeit nicht unterstützt. Bitte verwenden Sie dazu die Suchmethode und die Auswahlmethode Abfrage. 2. Die dynamische Abfrage getFieldBy fragt ein bestimmtes Feld ab und gibt den Wert eines bestimmten Felds zurück, z. B.
$userId = $User->getFieldByName('liu21st','id');
bedeutet, den ID-Wert des Benutzers basierend auf dem Namen des Benutzers abzurufen.
Unterabfrage
Ab Version 3.0 wurde Unterabfrageunterstützung hinzugefügt. Es gibt zwei Möglichkeiten, sie zu verwenden: 1. Verwenden Sie die Select-Methode, wenn der Parameter der Select Wenn die Methode falsch ist, bedeutet dies, dass keine Abfrage ausgeführt wird und nur die konstruierte SQL zurückgegeben wird, zum Beispiel:
// Erstellen Sie zuerst die Unterabfrage SQL
$subQuery = $model-> ;field('id,name')-> ;table('tablename')->group('field')->where($where)->order('status')->select(false );
Wenn die select-Methode den Parameter false übergibt, bedeutet dies, dass die aktuelle Abfrage nicht ausgeführt wird, sondern nur die Abfrage-SQL generiert wird. 2. Verwenden Sie die buildSql-Methode
$subQuery = $model->field('id,name')->table('tablename')->group('field')->where ( $where)->order('status')->buildSql();
Nach dem Aufruf der buildSql-Methode wird nicht der eigentliche Abfragevorgang ausgeführt, sondern nur die SQL-Anweisung der Abfrage generiert werden (um Verwirrung zu vermeiden, werden auf beiden Seiten des SQL Klammern hinzugefügt), und dann rufen wir es in nachfolgenden Abfragen direkt auf.
// Abfrage mit Unterabfragen
$model->table($subQuery.' a')->where()->order()->select( ) Die Die von
erstellte Unterabfrage-SQL kann in den kohärenten Operationsmethoden von ThinkPHP verwendet werden, z. B. in der Tabellen-Where usw.
Zusammenfassung
Dieser Artikel hilft uns hauptsächlich zu verstehen, wie Daten abgefragt werden, einschließlich einfacher Abfragen, Ausdrucksabfragen, Schnellabfragen, Intervallabfragen, statistischen Abfragen und der Durchführung Unterabfrageoperationen. Später werden wir mehr darüber erfahren, wie man kohärente Operationen verwendet, um komplexere CURD-Operationen durchzuführen.
Das Obige ist der Inhalt der ThinkPHP3.1 Quick Start (3) Query Language. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)