Die folgende Tutorial-Kolumne von thinkphp führt Sie in die Ansichtsabfrage, Unterabfrage und native Abfrage von ThinkPHP-Datenbankoperationen ein. Ich hoffe, dass sie für Freunde in Not hilfreich ist!
Ansichtsabfrage
Ansichtsabfrage kann Mehrtabellenabfragen implementieren, die nicht auf Datenbankansichten basieren, und erfordert nicht, dass die Datenbank Ansichten unterstützt:
Db::view('User','id,name') ->view('Profile','truename,phone,email','Profile.user_id=User.id') ->view('Score','score','Score.user_id=Profile.id') ->where('score','>',80) ->select();
Die generierte SQL-Anweisung ähnelt:
SELECT User.id,User.name,Profile.truename,Profile.phone,Profile.email,Score.score FROM think_user User INNER JOIN think_profile Profile ON Profile.user_id=User.id INNER JOIN think_socre Score ON Score.user_id=Profile.id WHERE Score.score > 80
Beachten Sie, dass bei der Ansichtsabfrage die Tabellen- und Join-Methoden nicht aufgerufen werden müssen. Beim Aufrufen der Where- und Order-Methoden müssen Sie nur den Feldnamen verwenden, ohne den Tabellennamen hinzuzufügen.
INNER-Join-Abfrage wird standardmäßig verwendet. Wenn Sie sie ändern müssen, können Sie Folgendes verwenden:
Db::view('User','id,name') ->view('Profile','truename,phone,email','Profile.user_id=User.id','LEFT') ->view('Score','score','Score.user_id=Profile.id','RIGHT') ->where('score','>',80) ->select();
Die generierte SQL-Anweisung ähnelt:
SELECT User.id,User.name,Profile.truename,Profile.phone,Profile.email,Score.score FROM think_user User LEFT JOIN think_profile Profile ON Profile.user_id=User.id RIGHT JOIN think_socre Score ON Score.user_id=Profile.id WHERE Score.score > 80
Sie können einen Alias verwenden:
Db::view('User',['id'=>'uid','name'=>'account']) ->view('Profile','truename,phone,email','Profile.user_id=User.id') ->view('Score','score','Score.user_id=Profile.id') ->where('score','>',80) ->select();
Die generierte SQL-Anweisung wird :
SELECT User.id AS uid,User.name AS account,Profile.truename,Profile.phone,Profile.email,Score.score FROM think_user User INNER JOIN think_profile Profile ON Profile.user_id=User.id INNER JOIN think_socre Score ON Score.user_id=Profile.id WHERE Score.score > 80
Sie können eine Array-Methode verwenden, um den Tabellennamen und den Alias zu definieren, zum Beispiel:
Db::view(['think_user'=>'member'],['id'=>'uid','name'=>'account']) ->view('Profile','truename,phone,email','Profile.user_id=member.id') ->view('Score','score','Score.user_id=Profile.id') ->where('score','>',80) ->select();
Die generierte SQL-Anweisung wird zu:
SELECT member.id AS uid,member.name AS account,Profile.truename,Profile.phone,Profile.email,Score.score FROM think_user member INNER JOIN think_profile Profile ON Profile.user_id=member.id INNER JOIN think_socre Score ON Score.user_id=Profile.id WHERE Score.score > 80
Unterabfrage
Erstellen Sie zunächst die Unterabfrage SQL Verwenden Sie die folgenden drei Methoden, um die Unterabfrage zu erstellen.
1. Verwenden Sie die Select-Methode
Wenn der Parameter der Select-Methode falsch ist, bedeutet dies, dass keine Abfrage ausgeführt wird und nur das konstruierte SQL zurückgegeben wird. Beispiel:
$subQuery = Db::table('think_user') ->field('id,name') ->where('id','>',10) ->select(false);
Die generierte Unterabfrage Ergebnis ist:
SELECT `id`,`name` FROM `think_user` WHERE `id` > 10
2. Verwenden Sie die fetchSql-Methode
Die fetchSql-Methode bedeutet, dass sie nicht nur die konstruierte SQL-Anweisung zurückgibt, sondern auch alle CURD-Abfragen unterstützt. Das von
$subQuery = Db::table('think_user') ->field('id,name') ->where('id','>',10) ->fetchSql(true) ->select();
generierte Unterabfrageergebnis lautet:
SELECT `id`,`name` FROM `think_user` WHERE `id` > 10
3. Verwenden Sie buildSql, um eine Unterabfrage zu erstellen buildSql-Methode, und es generiert lediglich die SQL-Anweisung für diese Abfrage (um Verwirrung zu vermeiden, werden auf beiden Seiten der SQL Klammern hinzugefügt), und dann rufen wir sie in nachfolgenden Abfragen direkt auf. Es ist zu beachten, dass Sie bei Verwendung der ersten beiden Methoden selbst „Klammern“ hinzufügen müssen.
Dann verwenden Sie die Unterabfrage, um eine neue Abfrage zu erstellen:
$subQuery = Db::table('think_user') ->field('id,name') ->where('id','>',10) ->buildSql();
4. Verwenden Sie Abschlüsse, um die Unterabfrage zu erstellen
IN/NOT IN und EXISTS/ NOT-Abfragen wie EXISTS können Abschlüsse direkt als Unterabfragen verwenden, zum Beispiel: ( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 )
Db::table($subQuery.' a')
->where('a.name','like','thinkphp')
->order('id','desc')
->select();
SELECT * FROM ( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 ) a WHERE a.name LIKE 'thinkphp' ORDER BY `id` desc
Db::table('think_user')
->where('id','IN',function($query){
$query->table('think_profile')->where('status',1)->field('id');
})
->select();
Die DB-Klasse unterstützt native SQL-Abfragen Zu den Operationen gehören hauptsächlich die folgenden zwei Methoden: Abfragemethode
Abfragemethode wird zum Ausführen von SQL-Abfragevorgängen verwendet. Wenn die Daten ungültig sind oder die Abfrage falsch ist, gibt sie „false“ zurück, andernfalls gibt sie die Abfrage zurück Ergebnisdatensatz (identisch mit der Auswahlmethode). Verwendungsbeispiel: SELECT * FROM `think_user` WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 )
execute wird für SQL-Vorgänge zum Aktualisieren und Schreiben von Daten verwendet. Wenn die Daten ungültig sind oder die Abfrage falsch ist, gibt sie „false“ zurück, andernfalls wird die Anzahl der betroffenen Datensätze zurückgegeben. Verwendungsbeispiel: Db::table('think_user')
->where(function($query){
$query->table('think_profile')->where('status',1);
},'exists')
->find();
unterstützt die Verwendung der Parameterbindung in nativen Abfragen, einschließlich Fragezeichen-Platzhaltern oder benannten Platzhaltern, zum Beispiel: Das obige ist der detaillierte Inhalt vonThinkPHP-Datenbankbetriebsansichtsabfrage, Unterabfrage, native Abfrage. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!SELECT * FROM `think_user` WHERE EXISTS ( SELECT * FROM `think_profile` WHERE `status`= 1 )