<br />
<b>Warning</b>:  putenv() has been disabled for security reasons in <b>/www/wwwroot/wiki.xtboke.com/includes/Setup.php</b> on line <b>309</b><br />
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.xtboke.com/index.php?action=history&amp;feed=atom&amp;title=Thinkphp5.0%E5%AD%90%E6%9F%A5%E8%AF%A2</id>
	<title>Thinkphp5.0子查询 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.xtboke.com/index.php?action=history&amp;feed=atom&amp;title=Thinkphp5.0%E5%AD%90%E6%9F%A5%E8%AF%A2"/>
	<link rel="alternate" type="text/html" href="http://wiki.xtboke.com/index.php?title=Thinkphp5.0%E5%AD%90%E6%9F%A5%E8%AF%A2&amp;action=history"/>
	<updated>2026-04-15T19:26:04Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>http://wiki.xtboke.com/index.php?title=Thinkphp5.0%E5%AD%90%E6%9F%A5%E8%AF%A2&amp;diff=233&amp;oldid=prev</id>
		<title>Xiaotian：​创建页面，内容为“{{Navbox|PHP相关|Thinkphp}} === 使用select方法 === 当select方法的参数为false的时候，表示不进行查询只是返回构建SQL，例如： &lt;pre&gt; $subQuery = Db::table('think_user')     -&gt;field('id,name')     -&gt;where('id','&gt;',10)     -&gt;select(false);  &lt;/pre&gt; 生成的subQuery结果为： &lt;pre&gt; SELECT `id`,`name` FROM `think_user` WHERE `id` &gt; 10 &lt;/pre&gt;  === 使用fetchSql方法 === fetchSql方法表示不进行查询而只是返回构建的SQL…”</title>
		<link rel="alternate" type="text/html" href="http://wiki.xtboke.com/index.php?title=Thinkphp5.0%E5%AD%90%E6%9F%A5%E8%AF%A2&amp;diff=233&amp;oldid=prev"/>
		<updated>2024-04-24T10:09:08Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“{{Navbox|PHP相关|Thinkphp}} === 使用select方法 === 当select方法的参数为false的时候，表示不进行查询只是返回构建SQL，例如： &amp;lt;pre&amp;gt; $subQuery = Db::table(&amp;#039;think_user&amp;#039;)     -&amp;gt;field(&amp;#039;id,name&amp;#039;)     -&amp;gt;where(&amp;#039;id&amp;#039;,&amp;#039;&amp;gt;&amp;#039;,10)     -&amp;gt;select(false);  &amp;lt;/pre&amp;gt; 生成的subQuery结果为： &amp;lt;pre&amp;gt; SELECT `id`,`name` FROM `think_user` WHERE `id` &amp;gt; 10 &amp;lt;/pre&amp;gt;  === 使用fetchSql方法 === fetchSql方法表示不进行查询而只是返回构建的SQL…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Navbox|PHP相关|Thinkphp}}&lt;br /&gt;
=== 使用select方法 ===&lt;br /&gt;
当select方法的参数为false的时候，表示不进行查询只是返回构建SQL，例如：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$subQuery = Db::table('think_user')&lt;br /&gt;
    -&amp;gt;field('id,name')&lt;br /&gt;
    -&amp;gt;where('id','&amp;gt;',10)&lt;br /&gt;
    -&amp;gt;select(false); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
生成的subQuery结果为：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT `id`,`name` FROM `think_user` WHERE `id` &amp;gt; 10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 使用fetchSql方法 ===&lt;br /&gt;
fetchSql方法表示不进行查询而只是返回构建的SQL语句，并且不仅仅支持select，而是支持所有的CURD查询。&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$subQuery = Db::table('think_user')&lt;br /&gt;
    -&amp;gt;field('id,name')&lt;br /&gt;
    -&amp;gt;where('id','&amp;gt;',10)&lt;br /&gt;
    -&amp;gt;fetchSql(true)&lt;br /&gt;
    -&amp;gt;select();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
生成的subQuery结果为：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT `id`,`name` FROM `think_user` WHERE `id` &amp;gt; 10 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 使用buildSql构造子查询 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$subQuery = Db::table('think_user')&lt;br /&gt;
    -&amp;gt;field('id,name')&lt;br /&gt;
    -&amp;gt;where('id','&amp;gt;',10)&lt;br /&gt;
    -&amp;gt;buildSql();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
生成的subQuery结果为：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
( SELECT `id`,`name` FROM `think_user` WHERE `id` &amp;gt; 10 )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
调用buildSql方法后不会进行实际的查询操作，而只是生成该次查询的SQL语句（为了避免混淆，会在SQL两边加上括号），然后我们直接在后续的查询中直接调用。&lt;br /&gt;
&lt;br /&gt;
'''需要注意的是，使用前两种方法需要自行添加‘括号’。'''&lt;br /&gt;
&lt;br /&gt;
然后使用子查询构造新的查询：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Db::table($subQuery.' a')&lt;br /&gt;
    -&amp;gt;where('a.name','like','thinkphp')&lt;br /&gt;
    -&amp;gt;order('id','desc')&lt;br /&gt;
    -&amp;gt;select();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
生成的SQL语句为：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM ( SELECT `id`,`name` FROM `think_user` WHERE `id` &amp;gt; 10 ) a WHERE a.name LIKE 'thinkphp' ORDER BY `id` desc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== 使用闭包构造子查询 ===&lt;br /&gt;
IN/NOT IN和EXISTS/NOT EXISTS之类的查询可以直接使用闭包作为子查询，例如：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Db::table('think_user')&lt;br /&gt;
-&amp;gt;where('id','IN',function($query){&lt;br /&gt;
    $query-&amp;gt;table('think_profile')-&amp;gt;where('status',1)-&amp;gt;field('id');&lt;br /&gt;
})&lt;br /&gt;
-&amp;gt;select();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
生成的SQL语句为：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM `think_user` WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Db::table('think_user')&lt;br /&gt;
-&amp;gt;where(function($query){&lt;br /&gt;
    $query-&amp;gt;table('think_profile')-&amp;gt;where('status',1);&lt;br /&gt;
},'exists')&lt;br /&gt;
-&amp;gt;find();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
生成的SQL语句为：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM `think_user` WHERE EXISTS ( SELECT * FROM `think_profile` WHERE `status` = 1 ) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category:thinkphp]]&lt;/div&gt;</summary>
		<author><name>Xiaotian</name></author>
	</entry>
</feed>