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 相关文章推荐
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
Dec 13 PHP
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
Jan 15 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
Jul 03 PHP
五款PHP代码重构工具推荐
Oct 14 PHP
yii数据库的查询方法
Dec 28 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
Dec 15 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
Dec 06 PHP
Laravel 修改默认日志文件名称和位置的例子
Oct 17 PHP
laravel利用中间件做防非法登录和权限控制示例
Oct 21 PHP
Laravel实现批量更新多条数据
Apr 06 PHP
深入解析PHP底层机制及相关原理
Dec 11 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 表单验证实现代码
2009/03/10 PHP
php读取javascript设置的cookies的代码
2010/04/12 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
bootstrap3-dialog-master模态框使用详解
2017/08/22 Javascript
vue滚动轴插件better-scroll使用详解
2017/10/17 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
ElementUI Tag组件实现多标签生成的方法示例
2019/07/08 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
小程序实现tab标签页
2020/11/16 Javascript
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
python数组过滤实现方法
2015/07/27 Python
python简单分割文件的方法
2015/07/30 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
python爬虫 线程池创建并获取文件代码实例
2019/09/28 Python
Django框架反向解析操作详解
2019/11/28 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
基于django2.2连oracle11g解决版本冲突的问题
2020/07/02 Python
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
allbeauty美国:英国在线美容店
2019/03/11 全球购物
C语言如何决定使用那种整数类型
2016/11/26 面试题
优秀员工自荐书
2013/12/19 职场文书
招聘单位介绍信
2014/01/14 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
pandas求平均数和中位数的方法实例
2021/08/04 Python
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server