tp5.1框架数据库子查询操作实例分析


Posted in PHP onMay 26, 2020

本文实例讲述了tp5.1框架数据库子查询操作。分享给大家供大家参考,具体如下:

首先构造子查询SQL,可以使用下面三种的方式来构建子查询。

使用fetchSql方法

fetchSql方法表示不进行查询而只是返回构建的SQL语句,并且不仅仅支持select,而是支持所有的CURD查询。

$subQuery = Db::table('think_user')
 ->field('id,name')
 ->where('id', '>', 10)
 ->fetchSql(true)
 ->select();

生成的subQuery结果为:

SELECT `id`,`name` FROM `think_user` WHERE `id` > 10

使用buildSql构造子查询

$subQuery = Db::table('think_user')
 ->field('id,name')
 ->where('id', '>', 10)
 ->buildSql();

生成的subQuery结果为:

( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 )

调用buildSql方法后不会进行实际的查询操作,而只是生成该次查询的SQL语句(为了避免混淆,会在SQL两边加上括号),然后我们直接在后续的查询中直接调用。

然后使用子查询构造新的查询:

Db::table($subQuery . ' a')
 ->where('a.name', 'like', 'thinkphp')
 ->order('id', 'desc')
 ->select();

生成的SQL语句为:

SELECT * FROM ( 
 SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 ) a 
WHERE 
 a.name LIKE 'thinkphp' 
ORDER BY 
 `id` 
desc

使用闭包构造子查询

IN/NOT INEXISTS/NOT EXISTS之类的查询可以直接使用闭包作为子查询,例如:

Db::table('think_user')
 ->where('id', 'IN', function ($query) {
  $query->table('think_profile')->where('status', 1)->field('id');
 })
 ->select();

生成的SQL语句是

SELECT * FROM `think_user` 
WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 )
Db::table('think_user')
 ->whereExists(function ($query) {
  $query->table('think_profile')->where('status', 1);
 })->find();

生成的SQL语句为

SELECT * FROM `think_user` 
WHERE EXISTS ( SELECT * FROM `think_profile` WHERE `status` = 1 )

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
smarty+adodb+部分自定义类的php开发模式
Dec 31 PHP
表单复选框向PHP传输数据的代码
Nov 13 PHP
攻克CakePHP系列三 表单数据增删改
Oct 22 PHP
php 正则表达式小结
Aug 31 PHP
php 获取本机外网/公网IP的代码
May 09 PHP
php中Ctype函数用法详解
Dec 09 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
Jul 13 PHP
PHP钩子与简单分发方式实例分析
Sep 04 PHP
vmware linux系统安装最新的php7图解
Apr 14 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
Apr 23 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 PHP
如何在PHP中使用AES加密算法加密数据
Jun 24 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
May 26 #PHP
Laravel 修改验证异常的响应格式实例代码详解
May 25 #PHP
tp5.1 框架查询表达式用法详解
May 25 #PHP
tp5.1 框架数据库高级查询技巧实例总结
May 25 #PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 25 #PHP
thinkphp5.1框架模板赋值与变量输出示例
May 25 #PHP
thinkphp5.1 框架钩子和行为用法实例分析
May 25 #PHP
You might like
单位速度在实战中的运用
2020/03/04 星际争霸
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
php多进程应用场景实例详解
2019/07/22 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
JS 显示当前日期与时间的代码
2010/03/24 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
python3字符串输出常见面试题总结
2020/12/01 Python
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
澳大利亚最早和最古老的巨型游戏专家:Yardgames
2020/02/20 全球购物
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
计算机专业毕业生推荐信
2013/11/25 职场文书
平面设计岗位职责
2013/12/14 职场文书
遗嘱继承公证书
2014/04/09 职场文书
入党培养人考察意见
2015/06/08 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
医学会议开幕词
2016/03/03 职场文书
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python