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 相关文章推荐
从零开始 教你如何搭建Discuz!4.1论坛
Jul 07 PHP
用mysql内存表来代替php session的类
Feb 01 PHP
PHP把网页保存为word文件的三种方法
Apr 01 PHP
php中unserialize返回false的解决方法
Sep 22 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
Oct 08 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
Feb 26 PHP
在PHP语言中使用JSON和将json还原成数组的方法
Jul 19 PHP
浅谈php和js中json的编码和解码
Oct 24 PHP
PHP查询分页的实现代码
Jun 09 PHP
PHP7引入的"??"和"?:"的区别讲解
Apr 08 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 PHP
Yii 实现数据加密和解密
Mar 09 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
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
Angular4 ElementRef的应用
2018/02/26 Javascript
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
js 数组详细操作方法及解析合集
2018/06/01 Javascript
Vue中的v-for循环key属性注意事项小结
2018/08/12 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
使用Selenium破解新浪微博的四宫格验证码
2018/10/19 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
期末自我鉴定
2014/02/02 职场文书
小学生期末评语
2014/04/21 职场文书
留学经费担保书
2014/05/12 职场文书
物流专业自荐信
2014/05/23 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP