本文實例講述了tp5.1框架數據庫子查詢操作。分享給大家供大家參考,具體如下:
首先構造子查詢SQL,可以使用下面三種的方式來構建子查詢。
使用fetchSql方法
fetchSql方法表示不進行查詢而只是返回構建的SQL語句,并且不僅僅支持select
,而是支持所有的CURD查詢。
1
2
3
4
5
|
$subQuery = Db::table( 'think_user' ) ->field( 'id,name' ) ->where( 'id' , '>' , 10) ->fetchSql(true) ->select(); |
生成的subQuery結果為:
1
|
SELECT `id`,` name ` FROM `think_user` WHERE `id` > 10 |
使用buildSql構造子查詢
1
2
3
4
|
$subQuery = Db::table( 'think_user' ) ->field( 'id,name' ) ->where( 'id' , '>' , 10) ->buildSql(); |
生成的subQuery結果為:
1
|
( SELECT `id`,` name ` FROM `think_user` WHERE `id` > 10 ) |
調用buildSql方法后不會進行實際的查詢操作,而只是生成該次查詢的SQL語句(為了避免混淆,會在SQL兩邊加上括號),然后我們直接在后續的查詢中直接調用。
然后使用子查詢構造新的查詢:
1
2
3
4
|
生成的SQL語句為:
1
2
3
4
5
6
7
|
SELECT * FROM ( SELECT `id`,` name ` FROM `think_user` WHERE `id` > 10 ) a WHERE a. name LIKE 'thinkphp' ORDER BY `id` desc |
使用閉包構造子查詢
IN/NOT IN
和EXISTS/NOT EXISTS
之類的查詢可以直接使用閉包作為子查詢,例如:
1
2
3
4
5
|
Db::table( 'think_user' ) ->where( 'id' , 'IN' , function ( $query ) { $query ->table( 'think_profile' )->where( 'status' , 1)->field( 'id' ); }) ->select(); |
生成的SQL語句是
1
2
|
SELECT * FROM `think_user` WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 ) |
1
2
3
4
|
Db::table( 'think_user' ) ->whereExists( function ( $query ) { $query ->table( 'think_profile' )->where( 'status' , 1); })->find(); |
生成的SQL語句為
1
2
|
SELECT * FROM `think_user` WHERE EXISTS ( SELECT * FROM `think_profile` WHERE `status` = 1 ) |
希望本文所述對大家基于ThinkPHP框架的PHP程序設計有所幫助。
原文鏈接:https://blog.csdn.net/qq_42176520/article/details/88695871